diff options
author | Campbell Barton <ideasman42@gmail.com> | 2016-02-22 21:04:32 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2016-02-22 21:04:32 +0300 |
commit | 36e732c89f93660f016f52ab9abcefa50dcd182d (patch) | |
tree | 4511a894141a3df9a1b22e80a6c812b2f697f4a0 /source/blender/editors/sculpt_paint | |
parent | 37915e0b792766555dd1fc0356d53fcec3fa924e (diff) |
Sculpt brush can now grab inwards w/ normal weight
Previously the grab brush could only move ourwards when normal aligned.
Diffstat (limited to 'source/blender/editors/sculpt_paint')
-rw-r--r-- | source/blender/editors/sculpt_paint/sculpt.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 245724f95c2..16259710362 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -2203,16 +2203,25 @@ static void do_grab_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode) SculptSession *ss = ob->sculpt; Brush *brush = BKE_paint_brush(&sd->paint); float grab_delta[3]; - float len; copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry); - len = len_v3(grab_delta); - if (brush->normal_weight > 0) { - mul_v3_fl(ss->cache->sculpt_normal_symm, len * brush->normal_weight); + /* signed to support grabbing in (to make a hole) as well as out. */ + const float len_signed = dot_v3v3(ss->cache->sculpt_normal_symm, ss->cache->grab_delta_symmetry); + + /* this scale effectively projects the offset so dragging follows the cursor, + * as the normal points towards the view, the scale increases. */ + float len_view_scale; + { + float view_aligned_normal[3]; + project_plane_v3_v3v3(view_aligned_normal, ss->cache->sculpt_normal_symm, ss->cache->view_normal); + len_view_scale = fabsf(dot_v3v3(view_aligned_normal, ss->cache->sculpt_normal_symm)); + len_view_scale = (len_view_scale > FLT_EPSILON) ? 1.0f / len_view_scale : 1.0f; + } + mul_v3_fl(grab_delta, 1.0f - brush->normal_weight); - add_v3_v3(grab_delta, ss->cache->sculpt_normal_symm); + madd_v3_v3fl(grab_delta, ss->cache->sculpt_normal_symm, (len_signed * brush->normal_weight) * len_view_scale); } SculptThreadedTaskData data = { |