Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c')
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c166
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,