diff options
author | Philipp Oeser <info@graphics-engineer.com> | 2021-04-26 18:42:38 +0300 |
---|---|---|
committer | Philipp Oeser <info@graphics-engineer.com> | 2021-04-27 18:23:47 +0300 |
commit | 6150dbb5bbed3773cc56b751a5a3608e74f56a72 (patch) | |
tree | 90f45c2d3fc8bb2a4eec96d0ac909e22060edc7e /source/blender/editors/sculpt_paint/paint_stroke.c | |
parent | 7eb9b7976ff4e6ba820595dc59178f1ac189db3e (diff) |
Fix T87815: Sculpt: Curve stroke scene spacing not working
This was just not implemented for curve strokes when world spacing was
introduced in rB87cafe92ce2f.
Now do the equivalent of what was done in said commit in
'paint_space_stroke', now in 'paint_line_strokes_spacing' as well.
Maniphest Tasks: T87815
Differential Revision: https://developer.blender.org/D11098
Diffstat (limited to 'source/blender/editors/sculpt_paint/paint_stroke.c')
-rw-r--r-- | source/blender/editors/sculpt_paint/paint_stroke.c | 54 |
1 files changed, 50 insertions, 4 deletions
diff --git a/source/blender/editors/sculpt_paint/paint_stroke.c b/source/blender/editors/sculpt_paint/paint_stroke.c index 57b1102219e..49ddf2f82d8 100644 --- a/source/blender/editors/sculpt_paint/paint_stroke.c +++ b/source/blender/editors/sculpt_paint/paint_stroke.c @@ -1184,14 +1184,43 @@ static void paint_line_strokes_spacing(bContext *C, const float new_pos[2]) { UnifiedPaintSettings *ups = stroke->ups; + Paint *paint = BKE_paint_get_active_from_context(C); + Brush *brush = BKE_paint_brush(paint); + ePaintMode mode = BKE_paintmode_get_active_from_context(C); + ARegion *region = CTX_wm_region(C); + + const bool use_scene_spacing = paint_stroke_use_scene_spacing(brush, mode); float mouse[2], dmouse[2]; float length; + float d_world_space_position[3] = {0.0f}; + float world_space_position_old[3], world_space_position_new[3]; - sub_v2_v2v2(dmouse, new_pos, old_pos); copy_v2_v2(stroke->last_mouse_position, old_pos); - length = normalize_v2(dmouse); + if (use_scene_spacing) { + bool hit_old = SCULPT_stroke_get_location(C, world_space_position_old, old_pos); + bool hit_new = SCULPT_stroke_get_location(C, world_space_position_new, new_pos); + mul_m4_v3(stroke->vc.obact->obmat, world_space_position_old); + mul_m4_v3(stroke->vc.obact->obmat, world_space_position_new); + if (hit_old && hit_new && stroke->stroke_over_mesh) { + sub_v3_v3v3(d_world_space_position, world_space_position_new, world_space_position_old); + length = len_v3(d_world_space_position); + stroke->stroke_over_mesh = true; + } + else { + length = 0.0f; + zero_v3(d_world_space_position); + stroke->stroke_over_mesh = hit_new; + if (stroke->stroke_over_mesh) { + copy_v3_v3(stroke->last_world_space_position, world_space_position_old); + } + } + } + else { + sub_v2_v2v2(dmouse, new_pos, old_pos); + length = normalize_v2(dmouse); + } BLI_assert(length >= 0.0f); @@ -1205,8 +1234,18 @@ static void paint_line_strokes_spacing(bContext *C, *length_residue = 0.0; if (length >= spacing) { - mouse[0] = stroke->last_mouse_position[0] + dmouse[0] * spacing_final; - mouse[1] = stroke->last_mouse_position[1] + dmouse[1] * spacing_final; + if (use_scene_spacing) { + float final_world_space_position[3]; + normalize_v3(d_world_space_position); + mul_v3_v3fl(final_world_space_position, d_world_space_position, spacing_final); + add_v3_v3v3( + final_world_space_position, world_space_position_old, final_world_space_position); + ED_view3d_project(region, final_world_space_position, mouse); + } + else { + mouse[0] = stroke->last_mouse_position[0] + dmouse[0] * spacing_final; + mouse[1] = stroke->last_mouse_position[1] + dmouse[1] * spacing_final; + } ups->overlap_factor = paint_stroke_integrate_overlap(stroke->brush, 1.0); @@ -1302,6 +1341,13 @@ static bool paint_stroke_curve_end(bContext *C, wmOperator *op, PaintStroke *str if (!stroke->stroke_started) { stroke->last_pressure = 1.0; copy_v2_v2(stroke->last_mouse_position, data + 2 * j); + + if (paint_stroke_use_scene_spacing(br, BKE_paintmode_get_active_from_context(C))) { + stroke->stroke_over_mesh = SCULPT_stroke_get_location( + C, stroke->last_world_space_position, data + 2 * j); + mul_m4_v3(stroke->vc.obact->obmat, stroke->last_world_space_position); + } + stroke->stroke_started = stroke->test_start(C, op, stroke->last_mouse_position); if (stroke->stroke_started) { |