diff options
Diffstat (limited to 'source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c')
-rw-r--r-- | source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c | 166 |
1 files changed, 129 insertions, 37 deletions
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c b/source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c index 1a38b91a18b..b45653a9361 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c @@ -70,41 +70,50 @@ static void copyData(const GpencilModifierData *md, GpencilModifierData *target) BKE_gpencil_modifier_copydata_generic(md, target); } -/* change stroke offsetness */ -static void deformStroke(GpencilModifierData *md, - Depsgraph *UNUSED(depsgraph), - Object *ob, - bGPDlayer *gpl, - bGPDframe *gpf, - bGPDstroke *gps) +static bool do_modifier(Object *ob, + OffsetGpencilModifierData *mmd, + bGPDlayer *gpl, + bGPDstroke *gps) { - OffsetGpencilModifierData *mmd = (OffsetGpencilModifierData *)md; - const int def_nr = BKE_object_defgroup_name_index(ob, mmd->vgname); + return is_stroke_affected_by_modifier(ob, + mmd->layername, + mmd->material, + mmd->pass_index, + mmd->layer_pass, + 1, + gpl, + gps, + mmd->flag & GP_OFFSET_INVERT_LAYER, + mmd->flag & GP_OFFSET_INVERT_PASS, + mmd->flag & GP_OFFSET_INVERT_LAYERPASS, + mmd->flag & GP_OFFSET_INVERT_MATERIAL); +} - float mat[4][4]; +/* Calculate transform matrix. */ +static float prepare_matrix(OffsetGpencilModifierData *mmd, float weight, float r_mat[4][4]) +{ float loc[3], rot[3], scale[3]; - if (!is_stroke_affected_by_modifier(ob, - mmd->layername, - mmd->material, - mmd->pass_index, - mmd->layer_pass, - 1, - gpl, - gps, - mmd->flag & GP_OFFSET_INVERT_LAYER, - mmd->flag & GP_OFFSET_INVERT_PASS, - mmd->flag & GP_OFFSET_INVERT_LAYERPASS, - mmd->flag & GP_OFFSET_INVERT_MATERIAL)) { - return; - } + mul_v3_v3fl(loc, mmd->loc, weight); + mul_v3_v3fl(rot, mmd->rot, weight); + mul_v3_v3fl(scale, mmd->scale, weight); + add_v3_fl(scale, 1.0); + loc_eul_size_to_mat4(r_mat, loc, rot, scale); + + return (scale[0] + scale[1] + scale[2]) / 3.0f; +} + +/* Calculate random seeds. */ +static void prepare_random_seeds( + GpencilModifierData *md, Object *ob, bGPDframe *gpf, bGPDstroke *gps, float rand[3][3]) +{ + OffsetGpencilModifierData *mmd = (OffsetGpencilModifierData *)md; int seed = mmd->seed; /* Make sure different modifiers get different seeds. */ seed += BLI_hash_string(ob->id.name + 2); seed += BLI_hash_string(md->name); - float rand[3][3]; float rand_offset = BLI_hash_int_01(seed); /* Get stroke index for random offset. */ @@ -129,9 +138,28 @@ static void deformStroke(GpencilModifierData *md, } } } +} - bGPdata *gpd = ob->data; +/* change stroke offsetness */ +static void deformPolyline(GpencilModifierData *md, + Depsgraph *UNUSED(depsgraph), + Object *ob, + bGPDlayer *gpl, + bGPDframe *gpf, + bGPDstroke *gps) +{ + OffsetGpencilModifierData *mmd = (OffsetGpencilModifierData *)md; + const int def_nr = BKE_object_defgroup_name_index(ob, mmd->vgname); + + if (!do_modifier(ob, mmd, gpl, gps)) { + return; + } + /* Calculate Random seeds. */ + float rand[3][3]; + prepare_random_seeds(md, ob, gpf, gps, rand); + + bGPdata *gpd = ob->data; for (int i = 0; i < gps->totpoints; i++) { bGPDspoint *pt = &gps->points[i]; MDeformVert *dvert = gps->dvert != NULL ? &gps->dvert[i] : NULL; @@ -161,20 +189,78 @@ static void deformStroke(GpencilModifierData *md, mul_m4_v3(mat_rnd, &pt->x); /* Calculate matrix. */ - mul_v3_v3fl(loc, mmd->loc, weight); - mul_v3_v3fl(rot, mmd->rot, weight); - mul_v3_v3fl(scale, mmd->scale, weight); - add_v3_fl(scale, 1.0); - loc_eul_size_to_mat4(mat, loc, rot, scale); - - /* Apply scale to thickness. */ - float unit_scale = (scale[0] + scale[1] + scale[2]) / 3.0f; + float mat[4][4]; + float unit_scale = prepare_matrix(mmd, weight, mat); pt->pressure *= unit_scale; mul_m4_v3(mat, &pt->x); } /* Calc geometry data. */ - BKE_gpencil_stroke_geometry_update(gpd, gps); + BKE_gpencil_stroke_geometry_update(gpd, gps, GP_GEO_UPDATE_DEFAULT); +} + +static void deformBezier(GpencilModifierData *md, + Depsgraph *UNUSED(depsgraph), + Object *ob, + bGPDlayer *gpl, + bGPDframe *gpf, + bGPDstroke *gps) +{ + OffsetGpencilModifierData *mmd = (OffsetGpencilModifierData *)md; + const int def_nr = BKE_object_defgroup_name_index(ob, mmd->vgname); + + if (!do_modifier(ob, mmd, gpl, gps)) { + return; + } + + /* Calculate Random seeds. */ + float rand[3][3]; + prepare_random_seeds(md, ob, gpf, gps, rand); + + bGPdata *gpd = ob->data; + bGPDcurve *gpc = gps->editcurve; + + for (int i = 0; i < gpc->tot_curve_points; i++) { + bGPDcurve_point *pt = &gpc->curve_points[i]; + BezTriple *bezt = &pt->bezt; + MDeformVert *dvert = (gpc->dvert != NULL) ? &gpc->dvert[i] : NULL; + + /* Verify vertex group. */ + const float weight = get_modifier_point_weight( + dvert, (mmd->flag & GP_OFFSET_INVERT_VGROUP) != 0, def_nr); + if (weight < 0.0f) { + continue; + } + + /* Calculate Random matrix. */ + float mat_rnd[4][4]; + float rnd_loc[3], rnd_rot[3], rnd_scale_weight[3]; + float rnd_scale[3] = {1.0f, 1.0f, 1.0f}; + + mul_v3_v3fl(rnd_loc, rand[0], weight); + mul_v3_v3fl(rnd_rot, rand[1], weight); + mul_v3_v3fl(rnd_scale_weight, rand[2], weight); + + mul_v3_v3v3(rnd_loc, mmd->rnd_offset, rnd_loc); + mul_v3_v3v3(rnd_rot, mmd->rnd_rot, rnd_rot); + madd_v3_v3v3(rnd_scale, mmd->rnd_scale, rnd_scale_weight); + + loc_eul_size_to_mat4(mat_rnd, rnd_loc, rnd_rot, rnd_scale); + /* Apply randomness matrix. */ + for (int j = 0; j < 3; j++) { + mul_m4_v3(mat_rnd, bezt->vec[j]); + } + + float mat[4][4]; + float unit_scale = prepare_matrix(mmd, weight, mat); + pt->pressure *= unit_scale; + + for (int j = 0; j < 3; j++) { + mul_m4_v3(mat, bezt->vec[j]); + } + } + + BKE_gpencil_stroke_geometry_update(gpd, gps, GP_GEO_UPDATE_DEFAULT); } static void bakeModifier(struct Main *UNUSED(bmain), @@ -187,7 +273,12 @@ static void bakeModifier(struct Main *UNUSED(bmain), LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) { LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { - deformStroke(md, depsgraph, ob, gpl, gpf, gps); + if (!GPENCIL_STROKE_TYPE_BEZIER(gps)) { + deformPolyline(md, depsgraph, ob, gpl, gpf, gps); + } + else { + deformBezier(md, depsgraph, ob, gpl, gpf, gps); + } } } } @@ -254,7 +345,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Offset = { /* copyData */ copyData, - /* deformStroke */ deformStroke, + /* deformPolyline */ deformPolyline, + /* deformBezier */ deformBezier, /* generateStrokes */ NULL, /* bakeModifier */ bakeModifier, /* remapTime */ NULL, |