From 0be88c7d15d2ad1af284c6283370173647ae74eb Mon Sep 17 00:00:00 2001 From: Falk David Date: Fri, 13 Nov 2020 21:43:00 +0100 Subject: GPencil: Merge GSoC curve edit mode Differential Revision: https://developer.blender.org/D8660 This patch is the result of the GSoC 2020 "Editing Grease Pencil Strokes Using Curves" project. It adds a submode to greasepencil edit mode that allows for the transformation of greasepencil strokes using bezier curves. More information about the project can be found here: https://wiki.blender.org/wiki/User:Filedescriptor/GSoC_2020. --- .../gpencil_modifiers/intern/MOD_gpencilarmature.c | 3 +- .../gpencil_modifiers/intern/MOD_gpencilarray.c | 2 +- .../gpencil_modifiers/intern/MOD_gpencilbuild.c | 51 ++++++++++++---------- .../gpencil_modifiers/intern/MOD_gpencilhook.c | 3 +- .../gpencil_modifiers/intern/MOD_gpencillattice.c | 3 +- .../gpencil_modifiers/intern/MOD_gpencilmirror.c | 2 +- .../gpencil_modifiers/intern/MOD_gpencilmultiply.c | 5 ++- .../gpencil_modifiers/intern/MOD_gpenciloffset.c | 3 +- .../gpencil_modifiers/intern/MOD_gpencilsimplify.c | 10 ++--- .../gpencil_modifiers/intern/MOD_gpencilsubdiv.c | 3 +- .../gpencil_modifiers/intern/MOD_gpenciltexture.c | 3 +- 11 files changed, 50 insertions(+), 38 deletions(-) (limited to 'source/blender/gpencil_modifiers') diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c index c67d622ffec..cc8eae64300 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c @@ -125,10 +125,11 @@ static void deformStroke(GpencilModifierData *md, if (!mmd->object) { return; } + bGPdata *gpd = ob->data; gpencil_deform_verts(mmd, ob, gps); /* Calc geometry data. */ - BKE_gpencil_stroke_geometry_update(gps); + BKE_gpencil_stroke_geometry_update(gpd, gps); } static void bakeModifier(Main *UNUSED(bmain), diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilarray.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilarray.c index 628c5bc0476..aa21bf192c4 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencilarray.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilarray.c @@ -255,7 +255,7 @@ static void generate_geometry(GpencilModifierData *md, /* Duplicate original strokes to create this instance. */ LISTBASE_FOREACH_BACKWARD (tmpStrokes *, iter, &stroke_cache) { /* Duplicate stroke */ - bGPDstroke *gps_dst = BKE_gpencil_stroke_duplicate(iter->gps, true); + bGPDstroke *gps_dst = BKE_gpencil_stroke_duplicate(iter->gps, true, true); /* Move points */ for (int i = 0; i < iter->gps->totpoints; i++) { diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilbuild.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilbuild.c index 5b5cc61bedc..8221c9288d4 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencilbuild.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilbuild.c @@ -115,7 +115,8 @@ static void gpf_clear_all_strokes(bGPDframe *gpf) * * Note: This won't be called if all points are present/removed */ -static void reduce_stroke_points(bGPDstroke *gps, +static void reduce_stroke_points(bGPdata *gpd, + bGPDstroke *gps, const int num_points, const eBuildGpencil_Transition transition) { @@ -180,7 +181,7 @@ static void reduce_stroke_points(bGPDstroke *gps, gps->totpoints = num_points; /* Calc geometry data. */ - BKE_gpencil_stroke_geometry_update(gps); + BKE_gpencil_stroke_geometry_update(gpd, gps); } /* --------------------------------------------- */ @@ -197,7 +198,10 @@ typedef struct tStrokeBuildDetails { } tStrokeBuildDetails; /* Sequential - Show strokes one after the other */ -static void build_sequential(BuildGpencilModifierData *mmd, bGPDframe *gpf, float fac) +static void build_sequential(BuildGpencilModifierData *mmd, + bGPdata *gpd, + bGPDframe *gpf, + float fac) { const size_t tot_strokes = BLI_listbase_count(&gpf->strokes); bGPDstroke *gps; @@ -236,25 +240,25 @@ static void build_sequential(BuildGpencilModifierData *mmd, bGPDframe *gpf, floa size_t last_visible = 0; switch (mmd->transition) { - /* Show in forward order - * - As fac increases, the number of visible points increases - */ + /* Show in forward order + * - As fac increases, the number of visible points increases + */ case GP_BUILD_TRANSITION_GROW: first_visible = 0; /* always visible */ last_visible = (size_t)roundf(totpoints * fac); break; - /* Hide in reverse order - * - As fac increases, the number of points visible at the end decreases - */ + /* Hide in reverse order + * - As fac increases, the number of points visible at the end decreases + */ case GP_BUILD_TRANSITION_SHRINK: first_visible = 0; /* always visible (until last point removed) */ last_visible = (size_t)(totpoints * (1.0f - fac)); break; - /* Hide in forward order - * - As fac increases, the early points start getting hidden - */ + /* Hide in forward order + * - As fac increases, the early points start getting hidden + */ case GP_BUILD_TRANSITION_FADE: first_visible = (size_t)(totpoints * fac); last_visible = totpoints; /* i.e. visible until the end, unless first overlaps this */ @@ -278,12 +282,12 @@ static void build_sequential(BuildGpencilModifierData *mmd, bGPDframe *gpf, floa else if (first_visible > cell->start_idx) { /* Starts partway through this stroke */ int num_points = cell->end_idx - first_visible; - reduce_stroke_points(cell->gps, num_points, mmd->transition); + reduce_stroke_points(gpd, cell->gps, num_points, mmd->transition); } else { /* Ends partway through this stroke */ int num_points = last_visible - cell->start_idx; - reduce_stroke_points(cell->gps, num_points, mmd->transition); + reduce_stroke_points(gpd, cell->gps, num_points, mmd->transition); } } } @@ -295,7 +299,10 @@ static void build_sequential(BuildGpencilModifierData *mmd, bGPDframe *gpf, floa /* --------------------------------------------- */ /* Concurrent - Show multiple strokes at once */ -static void build_concurrent(BuildGpencilModifierData *mmd, bGPDframe *gpf, float fac) +static void build_concurrent(BuildGpencilModifierData *mmd, + bGPdata *gpd, + bGPDframe *gpf, + float fac) { bGPDstroke *gps, *gps_next; int max_points = 0; @@ -390,16 +397,14 @@ static void build_concurrent(BuildGpencilModifierData *mmd, bGPDframe *gpf, floa } else if (num_points < gps->totpoints) { /* Remove some points */ - reduce_stroke_points(gps, num_points, mmd->transition); + reduce_stroke_points(gpd, gps, num_points, mmd->transition); } } } /* --------------------------------------------- */ -static void generate_geometry(GpencilModifierData *md, - Depsgraph *depsgraph, - bGPDlayer *gpl, - bGPDframe *gpf) +static void generate_geometry( + GpencilModifierData *md, Depsgraph *depsgraph, bGPdata *gpd, bGPDlayer *gpl, bGPDframe *gpf) { BuildGpencilModifierData *mmd = (BuildGpencilModifierData *)md; const bool reverse = (mmd->transition != GP_BUILD_TRANSITION_GROW); @@ -504,11 +509,11 @@ static void generate_geometry(GpencilModifierData *md, /* Time management mode */ switch (mmd->mode) { case GP_BUILD_MODE_SEQUENTIAL: - build_sequential(mmd, gpf, fac); + build_sequential(mmd, gpd, gpf, fac); break; case GP_BUILD_MODE_CONCURRENT: - build_concurrent(mmd, gpf, fac); + build_concurrent(mmd, gpd, gpf, fac); break; default: @@ -530,7 +535,7 @@ static void generateStrokes(GpencilModifierData *md, Depsgraph *depsgraph, Objec if (gpf == NULL) { continue; } - generate_geometry(md, depsgraph, gpl, gpf); + generate_geometry(md, depsgraph, gpd, gpl, gpf); } } diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilhook.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilhook.c index f0838e4522d..09cce3f1ab4 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencilhook.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilhook.c @@ -228,6 +228,7 @@ static void deformStroke(GpencilModifierData *md, mmd->flag & GP_HOOK_INVERT_MATERIAL)) { return; } + bGPdata *gpd = ob->data; /* init struct */ tData.curfalloff = mmd->curfalloff; @@ -273,7 +274,7 @@ static void deformStroke(GpencilModifierData *md, gpencil_hook_co_apply(&tData, weight, pt); } /* Calc geometry data. */ - BKE_gpencil_stroke_geometry_update(gps); + BKE_gpencil_stroke_geometry_update(gpd, gps); } /* FIXME: Ideally we be doing this on a copy of the main depsgraph diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencillattice.c b/source/blender/gpencil_modifiers/intern/MOD_gpencillattice.c index 098a2edf04a..b2a83e83c9e 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencillattice.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencillattice.c @@ -85,6 +85,7 @@ static void deformStroke(GpencilModifierData *md, bGPDframe *UNUSED(gpf), bGPDstroke *gps) { + bGPdata *gpd = ob->data; LatticeGpencilModifierData *mmd = (LatticeGpencilModifierData *)md; const int def_nr = BKE_object_defgroup_name_index(ob, mmd->vgname); @@ -121,7 +122,7 @@ static void deformStroke(GpencilModifierData *md, (struct LatticeDeformData *)mmd->cache_data, &pt->x, mmd->strength * weight); } /* Calc geometry data. */ - BKE_gpencil_stroke_geometry_update(gps); + BKE_gpencil_stroke_geometry_update(gpd, gps); } /* FIXME: Ideally we be doing this on a copy of the main depsgraph diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c index a5457c86ec0..111c60436bf 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c @@ -151,7 +151,7 @@ static void generate_geometry(GpencilModifierData *md, Object *ob, bGPDlayer *gp mmd->flag & GP_MIRROR_INVERT_PASS, mmd->flag & GP_MIRROR_INVERT_LAYERPASS, mmd->flag & GP_MIRROR_INVERT_MATERIAL)) { - gps_new = BKE_gpencil_stroke_duplicate(gps, true); + gps_new = BKE_gpencil_stroke_duplicate(gps, true, true); update_position(ob, mmd, gps_new, xi); BLI_addtail(&gpf->strokes, gps_new); } diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilmultiply.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilmultiply.c index 7d0e3ce53fe..445f677e616 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencilmultiply.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilmultiply.c @@ -129,6 +129,7 @@ static void duplicateStroke(Object *ob, float fading_thickness, float fading_opacity) { + bGPdata *gpd = ob->data; int i; bGPDstroke *new_gps = NULL; float stroke_normal[3]; @@ -172,7 +173,7 @@ static void duplicateStroke(Object *ob, * to be processed, since we duplicate its data. */ for (i = count - 1; i >= 0; i--) { if (i != 0) { - new_gps = BKE_gpencil_stroke_duplicate(gps, true); + new_gps = BKE_gpencil_stroke_duplicate(gps, true, true); BLI_addtail(results, new_gps); } else { @@ -199,7 +200,7 @@ static void duplicateStroke(Object *ob, } /* Calc geometry data. */ if (new_gps != NULL) { - BKE_gpencil_stroke_geometry_update(new_gps); + BKE_gpencil_stroke_geometry_update(gpd, new_gps); } MEM_freeN(t1_array); MEM_freeN(t2_array); diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c b/source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c index 634aac00777..4e009e25ce3 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c @@ -100,6 +100,7 @@ static void deformStroke(GpencilModifierData *md, mmd->flag & GP_OFFSET_INVERT_MATERIAL)) { return; } + bGPdata *gpd = ob->data; for (int i = 0; i < gps->totpoints; i++) { bGPDspoint *pt = &gps->points[i]; @@ -125,7 +126,7 @@ static void deformStroke(GpencilModifierData *md, mul_m4_v3(mat, &pt->x); } /* Calc geometry data. */ - BKE_gpencil_stroke_geometry_update(gps); + BKE_gpencil_stroke_geometry_update(gpd, gps); } static void bakeModifier(struct Main *UNUSED(bmain), diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilsimplify.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilsimplify.c index 7052c59ae40..8093be2f560 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencilsimplify.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilsimplify.c @@ -92,26 +92,26 @@ static void deformStroke(GpencilModifierData *md, mmd->flag & GP_SIMPLIFY_INVERT_MATERIAL)) { return; } - + bGPdata *gpd = ob->data; /* Select simplification mode. */ switch (mmd->mode) { case GP_SIMPLIFY_FIXED: { for (int i = 0; i < mmd->step; i++) { - BKE_gpencil_stroke_simplify_fixed(gps); + BKE_gpencil_stroke_simplify_fixed(gpd, gps); } break; } case GP_SIMPLIFY_ADAPTIVE: { /* simplify stroke using Ramer-Douglas-Peucker algorithm */ - BKE_gpencil_stroke_simplify_adaptive(gps, mmd->factor); + BKE_gpencil_stroke_simplify_adaptive(gpd, gps, mmd->factor); break; } case GP_SIMPLIFY_SAMPLE: { - BKE_gpencil_stroke_sample(gps, mmd->length, false); + BKE_gpencil_stroke_sample(gpd, gps, mmd->length, false); break; } case GP_SIMPLIFY_MERGE: { - BKE_gpencil_stroke_merge_distance(gpf, gps, mmd->distance, true); + BKE_gpencil_stroke_merge_distance(gpd, gpf, gps, mmd->distance, true); break; } default: diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilsubdiv.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilsubdiv.c index 8f17be97710..c91bb1cef92 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencilsubdiv.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilsubdiv.c @@ -80,6 +80,7 @@ static void deformStroke(GpencilModifierData *md, bGPDstroke *gps) { SubdivGpencilModifierData *mmd = (SubdivGpencilModifierData *)md; + bGPdata *gpd = ob->data; /* It makes sense when adding points to a straight line */ /* e.g. for creating thickness variation in later modifiers. */ @@ -100,7 +101,7 @@ static void deformStroke(GpencilModifierData *md, return; } - BKE_gpencil_stroke_subdivide(gps, mmd->level, mmd->type); + BKE_gpencil_stroke_subdivide(gpd, gps, mmd->level, mmd->type); /* If the stroke is cyclic, must generate the closing geometry. */ if (gps->flag & GP_STROKE_CYCLIC) { diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpenciltexture.c b/source/blender/gpencil_modifiers/intern/MOD_gpenciltexture.c index 6a630cbf978..c396dffad27 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpenciltexture.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpenciltexture.c @@ -82,6 +82,7 @@ static void deformStroke(GpencilModifierData *md, { TextureGpencilModifierData *mmd = (TextureGpencilModifierData *)md; const int def_nr = BKE_object_defgroup_name_index(ob, mmd->vgname); + bGPdata *gpd = ob->data; if (!is_stroke_affected_by_modifier(ob, mmd->layername, @@ -102,7 +103,7 @@ static void deformStroke(GpencilModifierData *md, gps->uv_translation[0] += mmd->fill_offset[0]; gps->uv_translation[1] += mmd->fill_offset[1]; gps->uv_scale *= mmd->fill_scale; - BKE_gpencil_stroke_geometry_update(gps); + BKE_gpencil_stroke_geometry_update(gpd, gps); } if (ELEM(mmd->mode, STROKE, STROKE_AND_FILL)) { -- cgit v1.2.3