diff options
author | Pablo Dobarro <pablodp606@gmail.com> | 2020-07-29 18:22:50 +0300 |
---|---|---|
committer | Pablo Dobarro <pablodp606@gmail.com> | 2020-07-29 18:22:50 +0300 |
commit | 03acbc7b71ac1ea64be05332dc19c1c11a1b818f (patch) | |
tree | 506e88115444d928f578e61c0a7fc8bcb3ab2e6a /source/blender/editors/sculpt_paint | |
parent | b9c7c904ede17afc3861a2d58d1ac65a6e87f664 (diff) | |
parent | 54a2fcc0f331b8971e8a105382e9a8f67e1859e3 (diff) |
Merge branch 'blender-v2.90-release'
Diffstat (limited to 'source/blender/editors/sculpt_paint')
-rw-r--r-- | source/blender/editors/sculpt_paint/sculpt.c | 11 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/sculpt_cloth.c | 17 |
2 files changed, 18 insertions, 10 deletions
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 590d04bed3d..92beb396629 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -5516,7 +5516,7 @@ static void do_brush_action(Sculpt *sd, Object *ob, Brush *brush, UnifiedPaintSe SculptSearchSphereData data = { .ss = ss, .sd = sd, - .radius_squared = square_f(ss->cache->radius * (1.0 + brush->cloth_sim_limit)), + .radius_squared = square_f(ss->cache->initial_radius * (1.0 + brush->cloth_sim_limit)), .original = false, .ignore_fully_ineffective = false, .center = ss->cache->initial_location, @@ -7208,11 +7208,16 @@ static void sculpt_restore_mesh(Sculpt *sd, Object *ob) SculptSession *ss = ob->sculpt; Brush *brush = BKE_paint_brush(&sd->paint); + /* For the cloth brush it makes more sense to not restore the mesh state to keep running the + * simulation from the previous state. */ + if (brush->sculpt_tool == SCULPT_TOOL_CLOTH) { + return; + } + /* Restore the mesh before continuing with anchored stroke. */ if ((brush->flag & BRUSH_ANCHORED) || ((brush->sculpt_tool == SCULPT_TOOL_GRAB || - brush->sculpt_tool == SCULPT_TOOL_ELASTIC_DEFORM || - brush->sculpt_tool == SCULPT_TOOL_CLOTH) && + brush->sculpt_tool == SCULPT_TOOL_ELASTIC_DEFORM) && BKE_brush_use_size_pressure(brush)) || (brush->flag & BRUSH_DRAG_DOT)) { diff --git a/source/blender/editors/sculpt_paint/sculpt_cloth.c b/source/blender/editors/sculpt_paint/sculpt_cloth.c index 6a2137b6626..4232be91034 100644 --- a/source/blender/editors/sculpt_paint/sculpt_cloth.c +++ b/source/blender/editors/sculpt_paint/sculpt_cloth.c @@ -254,8 +254,7 @@ static void do_cloth_brush_apply_forces_task_cb_ex(void *__restrict userdata, /* Gravity */ float gravity[3] = {0.0f}; if (ss->cache->supports_gravity) { - madd_v3_v3fl( - gravity, ss->cache->gravity_direction, -ss->cache->radius * data->sd->gravity_factor); + madd_v3_v3fl(gravity, ss->cache->gravity_direction, -data->sd->gravity_factor); } /* Original data for deform brushes. */ @@ -279,6 +278,11 @@ static void do_cloth_brush_apply_forces_task_cb_ex(void *__restrict userdata, copy_v3_v3(current_vertex_location, vd.co); } + /* Apply gravity in the entire simulation area. */ + float vertex_gravity[3]; + mul_v3_v3fl(vertex_gravity, gravity, sim_factor); + cloth_brush_apply_force_to_vertex(ss, ss->cache->cloth_sim, vertex_gravity, vd.index); + /* When using the plane falloff mode the falloff is not constrained by the brush radius. */ if (sculpt_brush_test_sq_fn(&test, current_vertex_location) || use_falloff_plane) { @@ -356,8 +360,6 @@ static void do_cloth_brush_apply_forces_task_cb_ex(void *__restrict userdata, break; } - madd_v3_v3fl(force, gravity, fade); - cloth_brush_apply_force_to_vertex(ss, ss->cache->cloth_sim, force, vd.index); } } @@ -639,12 +641,13 @@ void SCULPT_do_cloth_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode /* In the first brush step of each symmetry pass, build the constraints for the vertices in all * nodes inside the simulation's limits. */ - /* Brush stroke types that restore the mesh on each brush step also need the cloth sim data to be - * created on each step. */ + /* Brushes that use anchored strokes and restore the mesh can't rely on symmetry passes and steps + * count as it is always the first step, so the simulation needs to be created when it does not + * exist for this stroke. */ if (SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache) || !ss->cache->cloth_sim) { /* The simulation structure only needs to be created on the first symmetry pass. */ - if (SCULPT_stroke_is_first_brush_step(ss->cache)) { + if (SCULPT_stroke_is_first_brush_step(ss->cache) || !ss->cache->cloth_sim) { ss->cache->cloth_sim = cloth_brush_simulation_create( ss, brush->cloth_mass, brush->cloth_damping); for (int i = 0; i < totverts; i++) { |