diff options
-rw-r--r-- | source/blender/editors/sculpt_paint/paint_cursor.c | 12 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/sculpt.c | 13 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/sculpt_intern.h | 3 |
3 files changed, 24 insertions, 4 deletions
diff --git a/source/blender/editors/sculpt_paint/paint_cursor.c b/source/blender/editors/sculpt_paint/paint_cursor.c index 08733a26187..f4d7869e40a 100644 --- a/source/blender/editors/sculpt_paint/paint_cursor.c +++ b/source/blender/editors/sculpt_paint/paint_cursor.c @@ -1154,7 +1154,8 @@ static void sculpt_geometry_preview_lines_draw(const uint gpuattr, if (ss->preview_vert_index_count > 0) { immBegin(GPU_PRIM_LINES, ss->preview_vert_index_count); for (int i = 0; i < ss->preview_vert_index_count; i++) { - immVertex3fv(gpuattr, SCULPT_vertex_co_get(ss, ss->preview_vert_index_list[i])); + immVertex3fv(gpuattr, + SCULPT_vertex_co_for_grab_active_get(ss, ss->preview_vert_index_list[i])); } immEnd(); } @@ -1572,7 +1573,14 @@ static void paint_cursor_draw_3d_view_brush_cursor_inactive(PaintCursorContext * /* Cursor location symmetry points. */ - const float *active_vertex_co = SCULPT_active_vertex_co_get(pcontext->ss); + const float *active_vertex_co; + if (brush->sculpt_tool == SCULPT_TOOL_GRAB && brush->flag & BRUSH_GRAB_ACTIVE_VERTEX) { + active_vertex_co = SCULPT_vertex_co_for_grab_active_get( + pcontext->ss, SCULPT_active_vertex_get(pcontext->ss)); + } + else { + active_vertex_co = SCULPT_active_vertex_co_get(pcontext->ss); + } if (len_v3v3(active_vertex_co, pcontext->location) < pcontext->radius) { immUniformColor3fvAlpha(pcontext->outline_col, pcontext->outline_alpha); cursor_draw_point_with_symmetry(pcontext->pos, diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index f2eb1359af7..c8ee4a75b1d 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -204,6 +204,14 @@ const float *SCULPT_vertex_persistent_co_get(SculptSession *ss, int index) return SCULPT_vertex_co_get(ss, index); } +const float *SCULPT_vertex_co_for_grab_active_get(SculptSession *ss, int index) +{ + if (ss->mvert) { + return ss->mvert[index].co; + } + return SCULPT_vertex_co_get(ss, index); +} + void SCULPT_vertex_limit_surface_get(SculptSession *ss, int index, float r_co[3]) { switch (BKE_pbvh_type(ss->pbvh)) { @@ -6694,7 +6702,8 @@ static void sculpt_update_brush_delta(UnifiedPaintSettings *ups, Object *ob, Bru if (SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) { if (tool == SCULPT_TOOL_GRAB && brush->flag & BRUSH_GRAB_ACTIVE_VERTEX) { - copy_v3_v3(cache->orig_grab_location, SCULPT_active_vertex_co_get(ss)); + copy_v3_v3(cache->orig_grab_location, + SCULPT_vertex_co_for_grab_active_get(ss, SCULPT_active_vertex_get(ss))); } else { copy_v3_v3(cache->orig_grab_location, cache->true_location); @@ -8366,7 +8375,7 @@ void SCULPT_geometry_preview_lines_update(bContext *C, SculptSession *ss, float totpoints++; if (!BLI_BITMAP_TEST(visited_vertices, to_v)) { BLI_BITMAP_ENABLE(visited_vertices, to_v); - const float *co = SCULPT_vertex_co_get(ss, to_v); + const float *co = SCULPT_vertex_co_for_grab_active_get(ss, to_v); if (len_squared_v3v3(brush_co, co) < radius * radius) { BLI_gsqueue_push(not_visited_vertices, &to_v); } diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h index d7497a6cd4c..9f28bd59d87 100644 --- a/source/blender/editors/sculpt_paint/sculpt_intern.h +++ b/source/blender/editors/sculpt_paint/sculpt_intern.h @@ -100,6 +100,9 @@ const float *SCULPT_vertex_color_get(SculptSession *ss, int index); const float *SCULPT_vertex_persistent_co_get(SculptSession *ss, int index); void SCULPT_vertex_persistent_normal_get(SculptSession *ss, int index, float no[3]); +/* Coordinates used for manipulating the base mesh when Grab Active Vertex is enabled. */ +const float *SCULPT_vertex_co_for_grab_active_get(SculptSession *ss, int index); + /* Returns the info of the limit surface when Multires is available, otherwise it returns the * current coordinate of the vertex. */ void SCULPT_vertex_limit_surface_get(SculptSession *ss, int index, float r_co[3]); |