From d4af049fabd4c388c1b1ed6c031030dac2efc0ec Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 20 Mar 2013 15:01:15 +0000 Subject: add option to convert grease pencil into poly line directly. Without this, bezier curves at 12 resolution are very high detail for many tasks when converted from freehand strokes. so add the option to convert 1:1 grease pencil points to curve polygons. also add use_handles option to curve conversion which is used when converting beziers to poly lines. --- source/blender/editors/gpencil/gpencil_edit.c | 39 +++++++++++++-------------- 1 file changed, 18 insertions(+), 21 deletions(-) (limited to 'source/blender/editors/gpencil') diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c index a4d3c5e1ee5..e4c7a1edbcb 100644 --- a/source/blender/editors/gpencil/gpencil_edit.c +++ b/source/blender/editors/gpencil/gpencil_edit.c @@ -63,6 +63,7 @@ #include "BKE_library.h" #include "BKE_object.h" #include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_tracking.h" #include "UI_interface.h" @@ -393,6 +394,7 @@ void GPENCIL_OT_active_frame_delete(wmOperatorType *ot) enum { GP_STROKECONVERT_PATH = 1, GP_STROKECONVERT_CURVE, + GP_STROKECONVERT_POLY, }; /* Defines for possible timing modes */ @@ -407,6 +409,7 @@ enum { static EnumPropertyItem prop_gpencil_convertmodes[] = { {GP_STROKECONVERT_PATH, "PATH", 0, "Path", ""}, {GP_STROKECONVERT_CURVE, "CURVE", 0, "Bezier Curve", ""}, + {GP_STROKECONVERT_POLY, "POLY", 0, "Polygon Curve", ""}, {0, NULL, 0, NULL, NULL} }; @@ -1278,13 +1281,14 @@ static void gp_stroke_norm_curve_weights(Curve *cu, float minmax_weights[2]) static void gp_layer_to_curve(bContext *C, ReportList *reports, bGPdata *gpd, bGPDlayer *gpl, int mode, int norm_weights, float rad_fac, int link_strokes, tGpTimingData *gtd) { + struct Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); bGPDframe *gpf = gpencil_layer_getframe(gpl, CFRA, 0); bGPDstroke *gps, *prev_gps = NULL; Object *ob; Curve *cu; Nurb *nu = NULL; - Base *base = BASACT, *newbase = NULL; + Base *base_orig = BASACT, *base_new = NULL; float minmax_weights[2] = {1.0f, 0.0f}; /* camera framing */ @@ -1306,16 +1310,12 @@ static void gp_layer_to_curve(bContext *C, ReportList *reports, bGPdata *gpd, bG /* init the curve object (remove rotation and get curve data from it) * - must clear transforms set on object, as those skew our results */ - ob = BKE_object_add(scene, OB_CURVE); - zero_v3(ob->loc); - zero_v3(ob->rot); - cu = ob->data; + ob = BKE_object_add_only_object(bmain, OB_CURVE, gpl->info); + cu = ob->data = BKE_curve_add(bmain, gpl->info, OB_CURVE); + base_new = BKE_scene_base_add(scene, ob); + cu->flag |= CU_3D; - /* rename object and curve to layer name */ - rename_id((ID *)ob, gpl->info); - rename_id((ID *)cu, gpl->info); - gtd->inittime = ((bGPDstroke *)gpf->strokes.first)->inittime; /* add points to curve */ @@ -1344,6 +1344,7 @@ static void gp_layer_to_curve(bContext *C, ReportList *reports, bGPdata *gpd, bG gp_stroke_to_path(C, gpl, gps, cu, subrect_ptr, &nu, minmax_weights, rad_fac, stitch, gtd); break; case GP_STROKECONVERT_CURVE: + case GP_STROKECONVERT_POLY: /* convert after */ gp_stroke_to_bezier(C, gpl, gps, cu, subrect_ptr, &nu, minmax_weights, rad_fac, stitch, gtd); break; default: @@ -1364,19 +1365,15 @@ static void gp_layer_to_curve(bContext *C, ReportList *reports, bGPdata *gpd, bG /* Create the path animation, if needed */ gp_stroke_path_animation(C, reports, cu, gtd); - /* Reset original object as active, else we can't edit operator's settings!!! */ - /* set layers OK */ - newbase = BASACT; - if (base) { - newbase->lay = base->lay; - ob->lay = newbase->lay; - } - - /* restore, BKE_object_add sets active */ - BASACT = base; - if (base) { - base->flag |= SELECT; + if (mode == GP_STROKECONVERT_POLY) { + for (nu = cu->nurb.first; nu; nu = nu->next) { + BKE_nurb_type_convert(nu, CU_POLY, false); + } } + + /* set the layer and select */ + base_new->lay = ob->lay = base_orig ? base_orig->lay : scene->lay; + base_new->flag = ob->flag = base_new->flag | SELECT; } /* --- */ -- cgit v1.2.3