diff options
author | falk <falkdavid@gmx.de> | 2020-08-11 14:35:31 +0300 |
---|---|---|
committer | falk <falkdavid@gmx.de> | 2020-08-11 14:35:31 +0300 |
commit | a8cc21f09ec440f814c54060c33c46d90263ba5c (patch) | |
tree | 7680398cf22a2605cc65893fc83c91d233c901b0 | |
parent | f3b140cf0a9cc31117a5c8d7d29a8e213ddda129 (diff) |
GPencil: Recalculate curve when stroke data changed
-rw-r--r-- | source/blender/editors/gpencil/gpencil_edit.c | 13 | ||||
-rw-r--r-- | source/blender/editors/gpencil/gpencil_vertex_paint.c | 25 |
2 files changed, 32 insertions, 6 deletions
diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c index dce0f7698d7..2c5d91bc9ad 100644 --- a/source/blender/editors/gpencil/gpencil_edit.c +++ b/source/blender/editors/gpencil/gpencil_edit.c @@ -204,8 +204,19 @@ static int gpencil_editmode_toggle_exec(bContext *C, wmOperator *op) ob->mode = mode; } + /* Recalculate editcurves for strokes where the geometry/vertex colors have changed */ if (GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd)) { - BKE_gpencil_strokes_selected_update_editcurve(gpd); + GP_EDITABLE_CURVES_BEGIN(gps_iter, C, gpl, gps, gpc) { + if (gpc->flag & GP_CURVE_NEEDS_STROKE_UPDATE) { + BKE_gpencil_stroke_editcurve_update(gps, gpd->curve_edit_threshold); + /* Update the selection from the stroke to the curve. */ + BKE_gpencil_editcurve_stroke_sync_selection(gps, gps->editcurve); + + gps->flag |= GP_STROKE_NEEDS_CURVE_UPDATE; + BKE_gpencil_stroke_geometry_update(gpd, gps); + } + } + GP_EDITABLE_CURVES_END(gps_iter); } /* setup other modes */ diff --git a/source/blender/editors/gpencil/gpencil_vertex_paint.c b/source/blender/editors/gpencil/gpencil_vertex_paint.c index b0dff6589da..59b880c2a70 100644 --- a/source/blender/editors/gpencil/gpencil_vertex_paint.c +++ b/source/blender/editors/gpencil/gpencil_vertex_paint.c @@ -819,8 +819,9 @@ static void gpencil_save_selected_point(tGP_BrushVertexpaintData *gso, gso->pbuffer_used++; } -/* Select points in this stroke and add to an array to be used later. */ -static void gpencil_vertexpaint_select_stroke(tGP_BrushVertexpaintData *gso, +/* Select points in this stroke and add to an array to be used later. + * Returns true if any point was hit and got saved */ +static bool gpencil_vertexpaint_select_stroke(tGP_BrushVertexpaintData *gso, bGPDstroke *gps, const char tool, const float diff_mat[4][4]) @@ -841,9 +842,11 @@ static void gpencil_vertexpaint_select_stroke(tGP_BrushVertexpaintData *gso, int index; bool include_last = false; + bool saved = false; + /* Check if the stroke collide with brush. */ if (!ED_gpencil_stroke_check_collision(gsc, gps, gso->mval, radius, diff_mat)) { - return; + return saved; } if (gps->totpoints == 1) { @@ -862,6 +865,7 @@ static void gpencil_vertexpaint_select_stroke(tGP_BrushVertexpaintData *gso, /* apply operation to this point */ if (pt_active != NULL) { gpencil_save_selected_point(gso, gps_active, 0, pc1); + saved = true; } } } @@ -913,6 +917,7 @@ static void gpencil_vertexpaint_select_stroke(tGP_BrushVertexpaintData *gso, } hit = true; gpencil_save_selected_point(gso, gps_active, index, pc1); + saved = true; } /* Only do the second point if this is the last segment, @@ -931,6 +936,7 @@ static void gpencil_vertexpaint_select_stroke(tGP_BrushVertexpaintData *gso, hit = true; gpencil_save_selected_point(gso, gps_active, index, pc2); include_last = false; + saved = true; } } else { @@ -949,8 +955,8 @@ static void gpencil_vertexpaint_select_stroke(tGP_BrushVertexpaintData *gso, if (pt_active != NULL) { hit = true; gpencil_save_selected_point(gso, gps_active, index, pc1); - include_last = false; + saved = true; } } } @@ -970,10 +976,13 @@ static void gpencil_vertexpaint_select_stroke(tGP_BrushVertexpaintData *gso, for (int repeat = 0; repeat < 50; repeat++) { gpencil_save_selected_point(gso, gps_active, -1, NULL); } + saved = true; } } } } + + return saved; } /* Apply vertex paint brushes to strokes in the given frame. */ @@ -1008,7 +1017,13 @@ static bool gpencil_vertexpaint_brush_do_frame(bContext *C, } /* Check points below the brush. */ - gpencil_vertexpaint_select_stroke(gso, gps, tool, diff_mat); + bool hit = gpencil_vertexpaint_select_stroke(gso, gps, tool, diff_mat); + + /* If stroke was hit and has an editcurve the curve needs an update */ + bGPDstroke *gps_active = (gps->runtime.gps_orig) ? gps->runtime.gps_orig : gps; + if (gps_active->editcurve != NULL && hit) { + gps_active->editcurve->flag |= GP_CURVE_NEEDS_STROKE_UPDATE; + } } /* For Average tool, need calculate the average resulting color from all colors |