GP: Add Subdivide Smooth option

This commit is contained in:
2018-12-13 23:30:29 +01:00
parent 26c8e09cff
commit c7a31bad9f

View File

@@ -3013,6 +3013,54 @@ void GPENCIL_OT_reproject(wmOperatorType *ot)
}
/* ******************* Stroke subdivide ************************** */
/* helper to smooth */
static void gp_smooth_stroke(bContext *C, wmOperator *op)
{
bGPdata *gpd = ED_gpencil_data_get_active(C);
const int repeat = RNA_int_get(op->ptr, "repeat");
float factor = RNA_float_get(op->ptr, "factor");
const bool only_selected = RNA_boolean_get(op->ptr, "only_selected");
const bool smooth_position = RNA_boolean_get(op->ptr, "smooth_position");
const bool smooth_thickness = RNA_boolean_get(op->ptr, "smooth_thickness");
const bool smooth_strength = RNA_boolean_get(op->ptr, "smooth_strength");
const bool smooth_uv = RNA_boolean_get(op->ptr, "smooth_uv");
if (factor == 0.0f) {
return;
}
GP_EDITABLE_STROKES_BEGIN(gpstroke_iter, C, gpl, gps)
{
if (gps->flag & GP_STROKE_SELECT) {
for (int r = 0; r < repeat; r++) {
for (int i = 0; i < gps->totpoints; i++) {
bGPDspoint *pt = &gps->points[i];
if ((only_selected) && ((pt->flag & GP_SPOINT_SELECT) == 0)) {
continue;
}
/* perform smoothing */
if (smooth_position) {
BKE_gpencil_smooth_stroke(gps, i, factor);
}
if (smooth_strength) {
BKE_gpencil_smooth_stroke_strength(gps, i, factor);
}
if (smooth_thickness) {
/* thickness need to repeat process several times */
for (int r2 = 0; r2 < r * 10; r2++) {
BKE_gpencil_smooth_stroke_thickness(gps, i, factor);
}
}
if (smooth_uv) {
BKE_gpencil_smooth_stroke_uv(gps, i, factor);
}
}
}
}
}
GP_EDITABLE_STROKES_END(gpstroke_iter);
}
/* helper: Count how many points need to be inserted */
static int gp_count_subdivision_cuts(bGPDstroke *gps)
@@ -3151,6 +3199,9 @@ static int gp_stroke_subdivide_exec(bContext *C, wmOperator *op)
}
GP_EDITABLE_STROKES_END(gpstroke_iter);
/* smooth stroke */
gp_smooth_stroke(C, op);
/* notifiers */
DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
@@ -3179,6 +3230,17 @@ void GPENCIL_OT_stroke_subdivide(wmOperatorType *ot)
/* avoid re-using last var because it can cause _very_ high value and annoy users */
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
/* Smooth parameters */
RNA_def_float(ot->srna, "factor", 0.0f, 0.0f, 2.0f, "Smooth", "", 0.0f, 2.0f);
prop = RNA_def_int(ot->srna, "repeat", 1, 1, 10, "Repeat", "", 1, 5);
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
RNA_def_boolean(ot->srna, "only_selected", true, "Selected Points",
"Smooth only selected points in the stroke");
RNA_def_boolean(ot->srna, "smooth_position", true, "Position", "");
RNA_def_boolean(ot->srna, "smooth_thickness", true, "Thickness", "");
RNA_def_boolean(ot->srna, "smooth_strength", false, "Strength", "");
RNA_def_boolean(ot->srna, "smooth_uv", false, "UV", "");
}
/* ** simplify stroke *** */
@@ -3595,52 +3657,12 @@ void GPENCIL_OT_stroke_split(wmOperatorType *ot)
static int gp_stroke_smooth_exec(bContext *C, wmOperator *op)
{
bGPdata *gpd = ED_gpencil_data_get_active(C);
const int repeat = RNA_int_get(op->ptr, "repeat");
float factor = RNA_float_get(op->ptr, "factor");
const bool only_selected = RNA_boolean_get(op->ptr, "only_selected");
const bool smooth_position = RNA_boolean_get(op->ptr, "smooth_position");
const bool smooth_thickness = RNA_boolean_get(op->ptr, "smooth_thickness");
const bool smooth_strength = RNA_boolean_get(op->ptr, "smooth_strength");
const bool smooth_uv = RNA_boolean_get(op->ptr, "smooth_uv");
/* sanity checks */
if (ELEM(NULL, gpd))
return OPERATOR_CANCELLED;
/* Go through each editable + selected stroke */
GP_EDITABLE_STROKES_BEGIN(gpstroke_iter, C, gpl, gps)
{
if (gps->flag & GP_STROKE_SELECT) {
if (factor > 0.0f) {
for (int r = 0; r < repeat; r++) {
for (int i = 0; i < gps->totpoints; i++) {
bGPDspoint *pt = &gps->points[i];
if ((only_selected) && ((pt->flag & GP_SPOINT_SELECT) == 0)) {
continue;
}
/* perform smoothing */
if (smooth_position) {
BKE_gpencil_smooth_stroke(gps, i, factor);
}
if (smooth_strength) {
BKE_gpencil_smooth_stroke_strength(gps, i, factor);
}
if (smooth_thickness) {
/* thickness need to repeat process several times */
for (int r2 = 0; r2 < r * 10; r2++) {
BKE_gpencil_smooth_stroke_thickness(gps, i, factor);
}
}
if (smooth_uv) {
BKE_gpencil_smooth_stroke_uv(gps, i, factor);
}
}
}
}
}
}
GP_EDITABLE_STROKES_END(gpstroke_iter);
gp_smooth_stroke(C, op);
/* notifiers */
DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
@@ -3676,5 +3698,4 @@ void GPENCIL_OT_stroke_smooth(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "smooth_thickness", true, "Thickness", "");
RNA_def_boolean(ot->srna, "smooth_strength", false, "Strength", "");
RNA_def_boolean(ot->srna, "smooth_uv", false, "UV", "");
}