Commit: 9d69d642ff17fad683840d055a9b4b8393de92da Author: Falk David Date: Fri Jul 17 13:36:14 2020 +0200 Branches: soc-2020-greasepencil-curve https://developer.blender.org/rB9d69d642ff17fad683840d055a9b4b8393de92da
GPencil: Recalculate curve when entering editmode =================================================================== M source/blender/blenkernel/BKE_gpencil_curve.h M source/blender/blenkernel/intern/gpencil_curve.c M source/blender/editors/gpencil/gpencil_edit.c M source/blender/makesrna/intern/rna_gpencil.c =================================================================== diff --git a/source/blender/blenkernel/BKE_gpencil_curve.h b/source/blender/blenkernel/BKE_gpencil_curve.h index 3527d678355..b066e901211 100644 --- a/source/blender/blenkernel/BKE_gpencil_curve.h +++ b/source/blender/blenkernel/BKE_gpencil_curve.h @@ -48,7 +48,8 @@ struct bGPDcurve *BKE_gpencil_stroke_editcurve_generate(struct bGPDstroke *gps, void BKE_gpencil_stroke_editcurve_update(struct bGPDstroke *gps, float error_threshold); void BKE_gpencil_editcurve_stroke_sync_selection(struct bGPDstroke *gps, struct bGPDcurve *gpc); void BKE_gpencil_stroke_editcurve_sync_selection(struct bGPDstroke *gps, struct bGPDcurve *gpc); -void BKE_gpencil_selected_strokes_editcurve_update(struct bGPdata *gpd); +void BKE_gpencil_strokes_selected_update_editcurve(struct bGPdata *gpd); +void BKE_gpencil_strokes_selected_sync_selection_editcurve(struct bGPdata *gpd); void BKE_gpencil_stroke_update_geometry_from_editcurve(struct bGPDstroke *gps); void BKE_gpencil_editcurve_recalculate_handles(struct bGPDstroke *gps); void BKE_gpencil_editcurve_subdivide(struct bGPDstroke *gps, const int cuts); diff --git a/source/blender/blenkernel/intern/gpencil_curve.c b/source/blender/blenkernel/intern/gpencil_curve.c index 3bd60746028..f04e1a4bd5f 100644 --- a/source/blender/blenkernel/intern/gpencil_curve.c +++ b/source/blender/blenkernel/intern/gpencil_curve.c @@ -991,4 +991,67 @@ void BKE_gpencil_editcurve_subdivide(bGPDstroke *gps, const int cuts) } } +void BKE_gpencil_strokes_selected_update_editcurve(bGPdata *gpd) +{ + const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd); + /* For all selected strokes, update edit curve. */ + LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { + if (!BKE_gpencil_layer_is_editable(gpl)) { + continue; + } + bGPDframe *init_gpf = (is_multiedit) ? gpl->frames.first : gpl->actframe; + for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) { + if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && is_multiedit)) { + LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { + /* skip deselected stroke */ + if (!(gps->flag & GP_STROKE_SELECT)) { + continue; + } + + /* Generate the curve if there is none or the stroke was changed */ + if (gps->editcurve == NULL) { + BKE_gpencil_stroke_editcurve_update(gps, gpd->curve_edit_threshold); + /* Continue if curve could not be generated. */ + if (gps->editcurve == NULL) { + continue; + } + } + else if (gps->editcurve->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->editcurve->resolution = gpd->editcurve_resolution; + gps->flag |= GP_STROKE_NEEDS_CURVE_UPDATE; + BKE_gpencil_stroke_geometry_update(gpd, gps); + } + } + } + } +} + +void BKE_gpencil_strokes_selected_sync_selection_editcurve(bGPdata *gpd) +{ + const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd); + /* Sync selection for all strokes with editcurve. */ + LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { + if (!BKE_gpencil_layer_is_editable(gpl)) { + continue; + } + bGPDframe *init_gpf = (is_multiedit) ? gpl->frames.first : gpl->actframe; + for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) { + if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && is_multiedit)) { + LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { + bGPDcurve *gpc = gps->editcurve; + if (gpc != NULL) { + /* Update the selection of every stroke that has an editcurve */ + BKE_gpencil_stroke_editcurve_sync_selection(gps, gpc); + } + } + } + } + } +} + /** \} */ diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c index 51cb9dea743..10857aed866 100644 --- a/source/blender/editors/gpencil/gpencil_edit.c +++ b/source/blender/editors/gpencil/gpencil_edit.c @@ -202,6 +202,10 @@ static int gpencil_editmode_toggle_exec(bContext *C, wmOperator *op) ob->mode = mode; } + if (GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd)) { + BKE_gpencil_strokes_selected_update_editcurve(gpd); + } + /* setup other modes */ ED_gpencil_setup_modes(C, gpd, mode); /* set cache as dirty */ diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c index b32b31f3dd3..2bd2aea94f8 100644 --- a/source/blender/makesrna/intern/rna_gpencil.c +++ b/source/blender/makesrna/intern/rna_gpencil.c @@ -186,7 +186,6 @@ static void rna_GPencil_curve_edit_mode_toggle(Main *bmain, Scene *scene, Pointe { ToolSettings *ts = scene->toolsettings; bGPdata *gpd = (bGPdata *)ptr->owner_id; - const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd); /* Curve edit mode is turned on. */ if (GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd)) { @@ -196,62 +195,11 @@ static void rna_GPencil_curve_edit_mode_toggle(Main *bmain, Scene *scene, Pointe ts->gpencil_selectmode_edit = GP_SELECTMODE_POINT; } - /* For all selected strokes, update edit curve. */ - LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { - if (!BKE_gpencil_layer_is_editable(gpl)) { - continue; - } - bGPDframe *init_gpf = (is_multiedit) ? gpl->frames.first : gpl->actframe; - for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) { - if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && is_multiedit)) { - LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { - /* skip deselected stroke */ - if (!(gps->flag & GP_STROKE_SELECT)) { - continue; - } - - /* Generate the curve if there is none or the stroke was changed */ - if (gps->editcurve == NULL) { - BKE_gpencil_stroke_editcurve_update(gps, gpd->curve_edit_threshold); - /* Continue if curve could not be generated. */ - if (gps->editcurve == NULL) { - continue; - } - } - else if (gps->editcurve->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->editcurve->resolution = gpd->editcurve_resolution; - gps->flag |= GP_STROKE_NEEDS_CURVE_UPDATE; - BKE_gpencil_stroke_geometry_update(gpd, gps); - } - } - } - } + BKE_gpencil_strokes_selected_update_editcurve(gpd); } /* Curve edit mode is turned off. */ else { - /* Sync selection for all strokes with editcurve. */ - LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { - if (!BKE_gpencil_layer_is_editable(gpl)) { - continue; - } - bGPDframe *init_gpf = (is_multiedit) ? gpl->frames.first : gpl->actframe; - for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) { - if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && is_multiedit)) { - LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { - bGPDcurve *gpc = gps->editcurve; - if (gpc != NULL) { - /* Update the selection of every stroke that has an editcurve */ - BKE_gpencil_stroke_editcurve_sync_selection(gps, gpc); - } - } - } - } - } + BKE_gpencil_strokes_selected_sync_selection_editcurve(gpd); } /* Standard update. */ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs