From 504c257daed50bfc28d565de5590ba0929700fc8 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Wed, 12 Aug 2020 12:35:52 +0200 Subject: GPencil: Add Sample parameter to Convert curve This allows to resample the stroke to avoid too dense geometry. --- source/blender/blenkernel/BKE_gpencil_curve.h | 3 ++- source/blender/blenkernel/intern/gpencil_curve.c | 10 ++++++++-- source/blender/editors/object/object_add.c | 2 +- source/blender/makesrna/intern/rna_object_api.c | 16 +++++++++++++--- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/source/blender/blenkernel/BKE_gpencil_curve.h b/source/blender/blenkernel/BKE_gpencil_curve.h index 952f5115707..213ebf7832c 100644 --- a/source/blender/blenkernel/BKE_gpencil_curve.h +++ b/source/blender/blenkernel/BKE_gpencil_curve.h @@ -38,7 +38,8 @@ void BKE_gpencil_convert_curve(struct Main *bmain, const bool gpencil_lines, const bool use_collections, const bool only_stroke, - const float scale_thickness); + const float scale_thickness, + const float sample); #ifdef __cplusplus } diff --git a/source/blender/blenkernel/intern/gpencil_curve.c b/source/blender/blenkernel/intern/gpencil_curve.c index 3ee74ed11c9..5c7a12870a6 100644 --- a/source/blender/blenkernel/intern/gpencil_curve.c +++ b/source/blender/blenkernel/intern/gpencil_curve.c @@ -173,6 +173,7 @@ static void gpencil_convert_spline(Main *bmain, const bool gpencil_lines, const bool only_stroke, const float scale_thickness, + const float sample, bGPDframe *gpf, Nurb *nu) { @@ -392,6 +393,9 @@ static void gpencil_convert_spline(Main *bmain, if ((cyclic) && (!do_stroke)) { BKE_gpencil_stroke_close(gps); } + if (sample > 0.0f) { + BKE_gpencil_stroke_sample(gps, sample, false); + } /* Recalc fill geometry. */ BKE_gpencil_stroke_geometry_update(gps); @@ -408,6 +412,7 @@ static void gpencil_convert_spline(Main *bmain, * \param use_collections: Create layers using collection names. * \param only_stroke: The material must be only stroke without fill. * \param scale_thickness: Scale thickness factor. + * \param sample: Sample distance, zero to disable. */ void BKE_gpencil_convert_curve(Main *bmain, Scene *scene, @@ -416,7 +421,8 @@ void BKE_gpencil_convert_curve(Main *bmain, const bool gpencil_lines, const bool use_collections, const bool only_stroke, - const float scale_thickness) + const float scale_thickness, + const float sample) { if (ELEM(NULL, ob_gp, ob_cu) || (ob_gp->type != OB_GPENCIL) || (ob_gp->data == NULL)) { return; @@ -455,7 +461,7 @@ void BKE_gpencil_convert_curve(Main *bmain, /* Read all splines of the curve and create a stroke for each. */ LISTBASE_FOREACH (Nurb *, nu, &cu->nurb) { gpencil_convert_spline( - bmain, ob_gp, ob_cu, gpencil_lines, only_stroke, scale_thickness, gpf, nu); + bmain, ob_gp, ob_cu, gpencil_lines, only_stroke, scale_thickness, sample, gpf, nu); } /* Tag for recalculation */ diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 41757579817..febd7457c0f 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -2647,7 +2647,7 @@ static int object_convert_exec(bContext *C, wmOperator *op) ob_gpencil = ED_gpencil_add_object(C, ob->loc, local_view_bits); copy_v3_v3(ob_gpencil->rot, ob->rot); copy_v3_v3(ob_gpencil->scale, ob->scale); - BKE_gpencil_convert_curve(bmain, scene, ob_gpencil, ob, false, false, true, 1.0f); + BKE_gpencil_convert_curve(bmain, scene, ob_gpencil, ob, false, false, true, 1.0f, 0.0f); gpencilConverted = true; } } diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c index 9e698b2b398..05db3dc25a1 100644 --- a/source/blender/makesrna/intern/rna_object_api.c +++ b/source/blender/makesrna/intern/rna_object_api.c @@ -715,7 +715,8 @@ bool rna_Object_generate_gpencil_strokes(Object *ob, Object *ob_gpencil, bool gpencil_lines, bool use_collections, - float scale_thickness) + float scale_thickness, + float sample) { if (ob->type != OB_CURVE) { BKE_reportf(reports, @@ -727,8 +728,15 @@ bool rna_Object_generate_gpencil_strokes(Object *ob, Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); - BKE_gpencil_convert_curve( - bmain, scene, ob_gpencil, ob, gpencil_lines, use_collections, false, scale_thickness); + BKE_gpencil_convert_curve(bmain, + scene, + ob_gpencil, + ob, + gpencil_lines, + use_collections, + false, + scale_thickness, + sample); WM_main_add_notifier(NC_GPENCIL | ND_DATA, NULL); @@ -1202,6 +1210,8 @@ void RNA_api_object(StructRNA *srna) parm = RNA_def_boolean(func, "use_collections", true, "", "Use Collections"); parm = RNA_def_float( func, "scale_thickness", 1.0f, 0.0f, FLT_MAX, "", "Thickness scaling factor", 0.0f, 100.0f); + parm = RNA_def_float( + func, "sample", 0.0f, 0.0f, FLT_MAX, "", "Sample distance, zero to disable", 0.0f, 100.0f); parm = RNA_def_boolean(func, "result", 0, "", "Result"); RNA_def_function_return(func, parm); } -- cgit v1.2.3