224 const float sculpt_co[3],
258 const float normal_weight,
266 float len_view_scale;
268 float view_aligned_normal[3];
272 len_view_scale = (len_view_scale > FLT_EPSILON) ? 1.0f / len_view_scale : 1.0f;
275 mul_v3_fl(grab_delta, 1.0f - normal_weight);
302 ss, &test,
data->brush->falloff_shape);
306 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
337 float effective_normal[3];
374 const float *area_no =
data->area_no;
375 const float *area_co =
data->area_co;
385 ss, &test,
data->brush->falloff_shape);
391 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
446 displace = radius *
offset;
473 const float *area_no =
data->area_no;
474 const float *area_co =
data->area_co;
484 ss, &test,
data->brush->falloff_shape);
489 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
544 displace = -radius *
offset;
578 const float *area_no_sp =
data->area_no_sp;
579 const float *area_co =
data->area_co;
583 const float bstrength =
data->clay_strength;
589 ss, &test,
data->brush->falloff_shape);
593 float normal_tilt[3];
605 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
610 float intr[3], intr_tilt[3];
620 const float tilt_mix = local_co[1] > 0.0f ? 0.0f : 1.0f;
645 float final_pressure = 0.0f;
659 const float displace = radius * (0.25f +
offset);
727 .area_no_sp = area_no_sp,
730 .clay_strength = clay_strength,
751 const float *area_no =
data->area_no;
752 const float *area_co =
data->area_co;
762 ss, &test,
data->brush->falloff_shape);
768 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
817 displace = radius *
offset;
855 const float *area_no =
data->area_no;
856 const float *area_co =
data->area_co;
876 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
881 float plane_dist_abs =
fabsf(plane_dist);
882 if (plane_dist > 0.0f) {
893 void *__restrict chunk_join,
894 void *__restrict chunk)
909 const float *area_no =
data->area_no;
910 const float *area_co =
data->area_co;
920 ss, &test,
data->brush->falloff_shape);
926 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
994 d_offset =
min_ff(radius, d_offset);
995 d_offset = d_offset / radius;
996 d_offset = 1.0f - d_offset;
997 displace =
fabsf(initial_radius * (0.25f +
offset + (d_offset * 0.15f)));
999 displace = -displace;
1029 const float *area_no_sp =
data->area_no_sp;
1030 const float *area_co =
data->area_co;
1089 const float displace = radius * (0.18f +
offset);
1092 float area_no_sp[3];
1134 float area_co_displaced[3];
1135 madd_v3_v3v3fl(area_co_displaced, area_co, area_no, -radius * 0.7f);
1164 .area_no_sp = area_no_sp,
1182 const float *grab_delta =
data->grab_delta;
1199 ss, &test,
data->brush->falloff_shape);
1206 if (!do_elastic && !sculpt_brush_test_sq_fn(&test, vd.
co)) {
1230 float delta_pinch_init[3], delta_pinch[3];
1245 float pinch_fade = pinch *
fade;
1252 mul_v3_fl(delta_pinch, 1.0f + pinch_fade);
1253 sub_v3_v3v3(delta_pinch, delta_pinch_init, delta_pinch);
1257 if (do_rake_rotation) {
1258 float delta_rotate[3];
1286 float grab_delta[3];
1292 if (bstrength < 0.0f) {
1311 .grab_delta = grab_delta,
1326 const float *cono =
data->cono;
1339 ss, &test,
data->brush->falloff_shape);
1345 if (!sculpt_brush_test_sq_fn(&test, orig_data.
co)) {
1371 float grab_delta[3];
1372 float tmp[3], cono[3];
1412 ss, &test,
data->brush->falloff_shape);
1418 if (!sculpt_brush_test_sq_fn(&test, orig_data.
co)) {
1421 float vec[3],
rot[3][3];
1450 static const int flip[8] = {1, -1, -1, 1, -1, 1, 1, -1};
1484 ss, &test,
data->brush->falloff_shape);
1490 if (!sculpt_brush_test_sq_fn(&test, orig_data.
co)) {
1503 const int vi = vd.
index;
1505 if (use_persistent_base) {
1518 (*disp_factor) +=
fabsf(
fade * bstrength * (*disp_factor)) *
1519 ((*disp_factor) > 0.0f ? -1.0f : 1.0f);
1522 (*disp_factor) +=
fade * bstrength * (1.05f -
fabsf(*disp_factor));
1525 const float clamp_mask = 1.0f - *vd.
mask;
1526 *disp_factor =
clamp_f(*disp_factor, -clamp_mask, clamp_mask);
1529 *disp_factor =
clamp_f(*disp_factor, -1.0f, 1.0f);
1535 if (use_persistent_base) {
1567 "layer displacement factor");
1598 ss, &test,
data->brush->falloff_shape);
1602 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
1656 const float *cono =
data->cono;
1666 ss, &test,
data->brush->falloff_shape);
1670 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
1696 float grab_delta[3];
1697 float tmp[3], cono[3];
1734 const float flippedbstrength =
data->flippedbstrength;
1744 ss, &test,
data->brush->falloff_shape);
1748 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
1793 float flippedbstrength, crease_correction;
1807 if (brush_alpha > 0.0f) {
1808 crease_correction /= brush_alpha * brush_alpha;
1812 flippedbstrength = (bstrength < 0.0f) ? -crease_correction * bstrength :
1813 crease_correction * bstrength;
1816 flippedbstrength *= -1.0f;
1831 .flippedbstrength = flippedbstrength,
1856 ss, &test,
data->brush->falloff_shape);
1859 float x_object_space[3];
1860 float z_object_space[3];
1865 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
1877 float disp_center[3];
1936 float stroke_xz[2][3];
1945 .stroke_xz = stroke_xz,
1960 const float *grab_delta =
data->grab_delta;
1973 ss, &test,
data->brush->falloff_shape);
1981 if (!sculpt_brush_test_sq_fn(&test, orig_data.
co)) {
1994 if (grab_silhouette) {
1995 float silhouette_test_dir[3];
2018 float grab_delta[3];
2031 .grab_delta = grab_delta,
2046 const float *grab_delta =
data->grab_delta;
2069 if (
ELEM(symm, 1, 2, 4, 7)) {
2075 float force =
len_v3(grab_delta) * dir * bstrength;
2081 float final_disp[3];
2085 mul_v3_fl(final_disp, bstrength * 20.0f);
2089 mul_v3_fl(final_disp, bstrength * 20.0f);
2094 mul_v3_fl(final_disp, bstrength * 20.0f);
2126 float grab_delta[3];
2139 .grab_delta = grab_delta,
2172 ss, &test,
data->brush->falloff_shape);
2177 if (!sculpt_brush_test_sq_fn(&test, orig_data.
co)) {
2208 float effective_normal[3];
2256 ss, &test,
data->brush->falloff_shape);
2261 if (!sculpt_brush_test_sq_fn(&test, orig_data.
co)) {
2273 float current_disp[3];
2274 float current_disp_norm[3];
2275 float final_disp[3] = {0.0f, 0.0f, 0.0f};
2294 float vertex_disp[3];
2295 float vertex_disp_norm[3];
2298 if (
dot_v3v3(current_disp_norm, vertex_disp_norm) > 0.0f) {
2316 bool filter_boundary_face_sets,
2319 float smooth_pos[3];
2320 float final_disp[3];
2321 float boundary_normal[3];
2323 int neighbor_count = 0;
2331 if (!filter_boundary_face_sets ||
2344 float to_neighbor[3];
2347 add_v3_v3(boundary_normal, to_neighbor);
2358 if (neighbor_count <= 2) {
2363 if (avg_count > 0) {
2364 mul_v3_fl(smooth_pos, 1.0f / avg_count);
2372 float smooth_closest_plane[3];
2375 if (is_boundary && avg_count == 2) {
2413 ss, &test,
data->brush->falloff_shape);
2418 if (!sculpt_brush_test_sq_fn(&test, orig_data.
co)) {
2461 for (
int i = 0; i < 4; i++) {
2489 ss, &test,
data->brush->falloff_shape);
2494 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
2555 ss, &test,
data->brush->falloff_shape);
2560 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
2573 float current_disp[3];
2574 float current_disp_norm[3];
2575 float interp_limit_surface_disp[3];
2594 float weights_accum = 1.0f;
2598 float vertex_disp[3];
2599 float vertex_disp_norm[3];
2600 float neighbor_limit_co[3];
2608 if (
dot_v3v3(current_disp_norm, vertex_disp_norm) >= 0.0f) {
2612 const float disp_interp =
clamp_f(
2613 -
dot_v3v3(current_disp_norm, vertex_disp_norm), 0.0f, 1.0f);
2614 madd_v3_v3fl(interp_limit_surface_disp, neighbor_limit_surface_disp, disp_interp);
2615 weights_accum += disp_interp;
2619 mul_v3_fl(interp_limit_surface_disp, 1.0f / weights_accum);
2657 totvert,
sizeof(
float[3]),
"prev displacement");
2659 for (
int i = 0; i < totvert; i++) {
2710 const float bstrength =
clamp_f(
data->strength, 0.0f, 1.0f);
2714 ss, &test,
data->brush->falloff_shape);
2719 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
2728 float avg[3], val[3];
2749 const float strength =
clamp_f(bstrength, 0.0f, 1.0f);
2752 const int iterations = 3;
2755 const int count = iterations * strength + 1;
2756 const float factor = iterations * strength /
count;
2758 for (iteration = 0; iteration <=
count; iteration++) {
2793 ss, &test,
data->brush->falloff_shape);
2797 if (!sculpt_brush_test_sq_fn(&test, vd.
co)) {
2804 if (bstrength > 0.0f) {
typedef float(TangentPoint)[2]
float BKE_brush_alpha_get(const struct Scene *scene, const struct Brush *brush)
void BKE_kelvinlet_grab(float radius_elem_disp[3], const KelvinletParams *params, const float elem_orig_co[3], const float brush_location[3], const float brush_delta[3])
void BKE_kelvinlet_grab_triscale(float radius_elem_disp[3], const KelvinletParams *params, const float elem_orig_co[3], const float brush_location[3], const float brush_delta[3])
void BKE_kelvinlet_init_params(KelvinletParams *params, float radius, float force, float shear_modulus, float poisson_ratio)
void BKE_kelvinlet_grab_biscale(float radius_elem_disp[3], const KelvinletParams *params, const float elem_orig_co[3], const float brush_location[3], const float brush_delta[3])
void BKE_kelvinlet_scale(float radius_elem_disp[3], const KelvinletParams *params, const float elem_orig_co[3], const float brush_location[3], const float surface_normal[3])
void BKE_kelvinlet_twist(float radius_elem_disp[3], const KelvinletParams *params, const float elem_orig_co[3], const float brush_location[3], const float surface_normal[3])
General operations, lookup, etc. for blender objects.
struct Brush * BKE_paint_brush(struct Paint *paint)
A BVH for high poly meshes.
#define BKE_pbvh_vertex_iter_begin(pbvh, node, vi, mode)
#define BKE_pbvh_vertex_iter_end
void BKE_pbvh_vert_tag_update_normal(PBVH *pbvh, int index)
PBVHProxyNode * BKE_pbvh_node_add_proxy(PBVH *pbvh, PBVHNode *node)
void BKE_pbvh_parallel_range_settings(struct TaskParallelSettings *settings, bool use_threading, int totnode)
MINLINE float max_ff(float a, float b)
MINLINE float pow2f(float x)
MINLINE float clamp_f(float value, float min, float max)
MINLINE float min_ff(float a, float b)
void plane_from_point_normal_v3(float r_plane[4], const float plane_co[3], const float plane_no[3])
MINLINE float plane_point_side_v3(const float plane[4], const float co[3])
void closest_to_plane_normalized_v3(float r_close[3], const float plane[4], const float pt[3])
float dist_signed_to_plane_v3(const float p[3], const float plane[4])
void closest_to_plane_v3(float r_close[3], const float plane[4], const float pt[3])
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
bool invert_m4_m4(float R[4][4], const float A[4][4])
void mul_m4_v3(const float M[4][4], float r[3])
void scale_m4_fl(float R[4][4], float scale)
void mul_v3_m4v3(float r[3], const float M[4][4], const float v[3])
void mul_v3_m3v3(float r[3], const float M[3][3], const float a[3])
void normalize_m4(float R[4][4]) ATTR_NONNULL()
void pow_qt_fl_normalized(float q[4], float f)
void axis_angle_normalized_to_mat3(float R[3][3], const float axis[3], float angle)
void mul_qt_v3(const float q[4], float r[3])
void copy_qt_qt(float q[4], const float a[4])
void rotate_v3_v3v3fl(float r[3], const float p[3], const float axis[3], float angle)
MINLINE float len_squared_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void mul_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE float normalize_v3(float r[3])
MINLINE void mul_v3_v3(float r[3], const float a[3])
MINLINE void sub_v3_v3(float r[3], const float a[3])
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE bool is_zero_v4(const float a[4]) ATTR_WARN_UNUSED_RESULT
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE bool is_zero_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
void project_plane_v3_v3v3(float out[3], const float p[3], const float v_plane[3])
MINLINE float dot_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
void interp_v3_v3v3(float r[3], const float a[3], const float b[3], float t)
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void negate_v3(float r[3])
MINLINE float normalize_v3_v3(float r[3], const float a[3])
MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
MINLINE void zero_v3(float r[3])
MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void add_v3_v3(float r[3], const float a[3])
MINLINE float len_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
void BLI_task_parallel_range(int start, int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
int BLI_task_parallel_thread_id(const TaskParallelTLS *tls)
#define ARRAY_SET_ITEMS(...)
@ BRUSH_SMEAR_DEFORM_PINCH
@ BRUSH_SMEAR_DEFORM_EXPAND
@ BRUSH_SMEAR_DEFORM_DRAG
@ BRUSH_SNAKE_HOOK_DEFORM_ELASTIC
@ BRUSH_ELASTIC_DEFORM_SCALE
@ BRUSH_ELASTIC_DEFORM_GRAB
@ BRUSH_ELASTIC_DEFORM_TWIST
@ BRUSH_ELASTIC_DEFORM_GRAB_BISCALE
@ BRUSH_ELASTIC_DEFORM_GRAB_TRISCALE
@ PAINT_FALLOFF_SHAPE_TUBE
@ BRUSH_SLIDE_DEFORM_DRAG
@ BRUSH_SLIDE_DEFORM_EXPAND
@ BRUSH_SLIDE_DEFORM_PINCH
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
Platform independent time functions.
SIMD_FORCE_INLINE btScalar angle(const btVector3 &v) const
Return the angle between this and another vector.
IconTextureDrawCall normal
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void *(* MEM_callocN)(size_t len, const char *str)
thread_local int thread_id
CCL_NAMESPACE_BEGIN ccl_device float fade(float t)
BLI_INLINE void flip_v3(float v[3], const ePaintSymmetryFlags symm)
const float * SCULPT_vertex_co_get(SculptSession *ss, int index)
int SCULPT_vertex_count_get(SculptSession *ss)
void SCULPT_orig_vert_data_update(SculptOrigVertData *orig_data, PBVHVertexIter *iter)
void SCULPT_orig_vert_data_init(SculptOrigVertData *data, Object *ob, PBVHNode *node, SculptUndoType type)
void SCULPT_boundary_info_ensure(Object *object)
int SCULPT_plane_point_side(const float co[3], const float plane[4])
void SCULPT_vertex_persistent_normal_get(SculptSession *ss, int index, float no[3])
bool SCULPT_vertex_has_unique_face_set(SculptSession *ss, int index)
SculptBrushTestFn SCULPT_brush_test_init_with_falloff_shape(SculptSession *ss, SculptBrushTest *test, char falloff_shape)
void SCULPT_tilt_effective_normal_get(const SculptSession *ss, const Brush *brush, float r_no[3])
void SCULPT_calc_area_normal_and_center(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float r_area_no[3], float r_area_co[3])
float SCULPT_brush_strength_factor(SculptSession *ss, const Brush *br, const float brush_point[3], const float len, const float vno[3], const float fno[3], const float mask, const int vertex_index, const int thread_id)
bool SCULPT_brush_test_cube(SculptBrushTest *test, const float co[3], const float local[4][4], const float roundness)
void SCULPT_vertex_normal_get(SculptSession *ss, int index, float no[3])
void SCULPT_vertex_limit_surface_get(SculptSession *ss, int index, float r_co[3])
bool SCULPT_vertex_is_boundary(const SculptSession *ss, const int index)
float SCULPT_brush_plane_offset_get(Sculpt *sd, SculptSession *ss)
bool SCULPT_stroke_is_main_symmetry_pass(StrokeCache *cache)
void SCULPT_brush_test_init(SculptSession *ss, SculptBrushTest *test)
void SCULPT_tilt_apply_to_normal(float r_normal[3], StrokeCache *cache, const float tilt_strength)
bool SCULPT_stroke_is_first_brush_step_of_symmetry_pass(StrokeCache *cache)
int SCULPT_plane_trim(const StrokeCache *cache, const Brush *brush, const float val[3])
void SCULPT_calc_brush_plane(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float r_area_no[3], float r_area_co[3])
void SCULPT_calc_area_normal(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float r_area_no[3])
const float * SCULPT_vertex_persistent_co_get(SculptSession *ss, int index)
void SCULPT_clip(Sculpt *sd, SculptSession *ss, float co[3], const float val[3])
void SCULPT_calc_area_center(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float r_area_co[3])
float SCULPT_automasking_factor_get(AutomaskingCache *automasking, SculptSession *ss, int vert)
static void sculpt_project_v3_normal_align(SculptSession *ss, const float normal_weight, float grab_delta[3])
void SCULPT_do_clay_thumb_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void sculpt_project_v3(const SculptProjectVector *spvc, const float vec[3], float r_vec[3])
static void do_fill_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void do_mask_brush_draw_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
void SCULPT_do_scrape_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_do_flatten_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static bool plane_point_side_flip(const float co[3], const float plane[4], const bool flip)
void SCULPT_do_nudge_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_do_mask_brush_draw(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_do_clay_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_do_crease_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_do_displacement_eraser_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_do_displacement_smear_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void do_clay_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void do_snake_hook_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
void SCULPT_relax_vertex(SculptSession *ss, PBVHVertexIter *vd, float factor, bool filter_boundary_face_sets, float *r_final_pos)
static void do_topology_slide_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
void SCULPT_do_inflate_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void sculpt_project_v3_cache_init(SculptProjectVector *spvc, const float plane[3])
static void do_clay_strips_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void do_rotate_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
void SCULPT_do_slide_relax_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void do_displacement_smear_store_prev_disp_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict UNUSED(tls))
static void do_pinch_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void sculpt_rake_rotate(const SculptSession *ss, const float sculpt_co[3], const float v_co[3], float factor, float r_delta[3])
static void do_elastic_deform_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict UNUSED(tls))
static void do_crease_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void do_nudge_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
struct SculptProjectVector SculptProjectVector
void SCULPT_do_rotate_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void calc_clay_surface_reduce(const void *__restrict UNUSED(userdata), void *__restrict chunk_join, void *__restrict chunk)
static void do_scrape_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void do_grab_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
void SCULPT_do_grab_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_do_elastic_deform_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void do_layer_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void calc_sculpt_plane(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float r_area_no[3], float r_area_co[3])
static void do_thumb_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void do_draw_sharp_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
void SCULPT_do_thumb_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_do_mask_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void do_topology_rake_bmesh_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void do_displacement_smear_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void do_displacement_eraser_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
void SCULPT_do_snake_hook_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void do_topology_relax_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void do_inflate_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void do_draw_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
void SCULPT_do_draw_sharp_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
static void do_clay_thumb_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
void SCULPT_do_clay_strips_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_do_layer_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_do_draw_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_bmesh_topology_rake(Sculpt *sd, Object *ob, PBVHNode **nodes, const int totnode, float bstrength)
float SCULPT_clay_thumb_get_stabilized_pressure(StrokeCache *cache)
static void do_flatten_brush_task_cb_ex(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
static void calc_clay_surface_task_cb(void *__restrict userdata, const int n, const TaskParallelTLS *__restrict tls)
struct ClaySampleData ClaySampleData
void SCULPT_do_pinch_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
void SCULPT_do_fill_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
#define SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN(ss, v_index, neighbor_iterator)
bool(* SculptBrushTestFn)(SculptBrushTest *test, const float co[3])
#define SCULPT_CLAY_STABILIZER_LEN
void SCULPT_bmesh_four_neighbor_average(float avg[3], float direction[3], struct BMVert *v)
#define SCULPT_VERTEX_NEIGHBORS_ITER_END(neighbor_iterator)
void SCULPT_smooth(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float bstrength, bool smooth_mask)
int snake_hook_deform_type
float normal_radius_factor
float elastic_deform_volume_preservation
struct CurveMapping * curve
float tilt_strength_factor
float crease_pinch_factor
struct SculptSession * sculpt
struct StrokeCache * cache
SculptPersistentBase * persistent_base
float true_view_normal[3]
float sculpt_normal_symm[3]
float(* limit_surface_co)[3]
float grab_delta_symmetry[3]
AutomaskingCache * automasking
float(* prev_displacement)[3]
bool is_rake_rotation_valid
float * layer_displacement_factor
float clay_pressure_stabilizer[SCULPT_CLAY_STABILIZER_LEN]
float clay_thumb_front_angle
float rake_rotation_symmetry[4]
TaskParallelReduceFunc func_reduce
size_t userdata_chunk_size