[Bf-blender-cvs] [908dfbf6182] greasepencil-object: GPencil: Modifier: Change Noise Modifier behavior
Clément Foucault
noreply at git.blender.org
Thu Mar 5 17:36:11 CET 2020
Commit: 908dfbf61824444ff7e024084c1634c9cbdacdd3
Author: Clément Foucault
Date: Thu Mar 5 17:32:21 2020 +0100
Branches: greasepencil-object
https://developer.blender.org/rB908dfbf61824444ff7e024084c1634c9cbdacdd3
GPencil: Modifier: Change Noise Modifier behavior
- Noise is applied using a different factor for each property.
- Move Extremes is replaced by a custom curve profile
- Each modifier will create a different result, making stacking possible.
- The result of the position noise will not make the stroke curl.
- Noise default instensity has been tweaked for every property type.
===================================================================
M release/scripts/startup/bl_ui/properties_data_modifier.py
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/versioning_280.c
M source/blender/blenloader/intern/writefile.c
M source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
M source/blender/makesdna/DNA_gpencil_modifier_types.h
M source/blender/makesrna/intern/rna_gpencil_modifier.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 98193f66315..10a3cddaec9 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1791,7 +1791,10 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
col = split.column()
row = col.row(align=True)
- row.prop(md, "factor")
+ row.prop(md, "factor", text="Position" )
+ row.prop(md, "factor_strength", text="Strength")
+ row.prop(md, "factor_thickness", text="Thickness")
+ row.prop(md, "factor_uvs", text="UV")
row.prop(md, "random", text="", icon='TIME', toggle=True)
row = col.row()
row.enabled = md.random
@@ -1799,16 +1802,12 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
row = col.row()
row.enabled = md.random
row.prop(md, "seed")
+
col.prop(md, "full_stroke")
- col.prop(md, "move_extreme")
+ col.prop(md, "use_custom_curve")
- row = layout.row(align=True)
- row.label(text="Affect:")
- row = layout.row(align=True)
- row.prop(md, "use_edit_position", text="Position", toggle=True)
- row.prop(md, "use_edit_strength", text="Strength", toggle=True)
- row.prop(md, "use_edit_thickness", text="Thickness", toggle=True)
- row.prop(md, "use_edit_uv", text="UV", toggle=True)
+ if md.use_custom_curve:
+ col.template_curve_mapping(md, "curve")
self.gpencil_masking(layout, ob, md, True)
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 6e8f8e48a12..9532468cf86 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5752,6 +5752,16 @@ static void direct_link_gpencil_modifiers(FileData *fd, ListBase *lb)
direct_link_curvemapping(fd, hmd->curfalloff);
}
}
+ else if (md->type == eGpencilModifierType_Noise) {
+ NoiseGpencilModifierData *gpmd = (NoiseGpencilModifierData *)md;
+
+ gpmd->curve_intensity = newdataadr(fd, gpmd->curve_intensity);
+ if (gpmd->curve_intensity) {
+ direct_link_curvemapping(fd, gpmd->curve_intensity);
+ /* initialize the curve. Maybe this could be moved to modififer logic */
+ BKE_curvemapping_initialize(gpmd->curve_intensity);
+ }
+ }
else if (md->type == eGpencilModifierType_Thick) {
ThickGpencilModifierData *gpmd = (ThickGpencilModifierData *)md;
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 1d0ac204080..2a35084f876 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -661,6 +661,27 @@ static void do_versions_area_ensure_tool_region(Main *bmain,
}
}
}
+
+ /* Grease pencil noise modifier curve. */
+ if (!DNA_struct_elem_find(fd->filesdna, "NoiseGpencilModifierData", "float", "factor_uvs")) {
+ LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
+ LISTBASE_FOREACH (ModifierData *, md, &ob->greasepencil_modifiers) {
+ if (md->type == eGpencilModifierType_Noise) {
+ NoiseGpencilModifierData *gpmd = (NoiseGpencilModifierData *)md;
+ gpmd->factor_thickness = gpmd->factor;
+ gpmd->factor_strength = gpmd->factor;
+ gpmd->factor_uvs = gpmd->factor;
+
+ if (gpmd->curve_intensity) {
+ gpmd->curve_intensity = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
+ if (gpmd->curve_intensity) {
+ BKE_curvemapping_initialize(gpmd->curve_intensity);
+ }
+ }
+ }
+ }
+ }
+ }
}
}
@@ -1061,6 +1082,13 @@ static void do_version_curvemapping_walker(Main *bmain, void (*callback)(CurveMa
callback(gpmd->curfalloff);
}
}
+ else if (md->type == eGpencilModifierType_Noise) {
+ NoiseGpencilModifierData *gpmd = (NoiseGpencilModifierData *)md;
+
+ if (gpmd->curve_intensity) {
+ callback(gpmd->curve_intensity);
+ }
+ }
}
}
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index f9fedfd061f..90c29fbaaad 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1801,6 +1801,13 @@ static void write_gpencil_modifiers(WriteData *wd, ListBase *modbase)
write_curvemapping(wd, gpmd->curve_thickness);
}
}
+ else if (md->type == eGpencilModifierType_Noise) {
+ NoiseGpencilModifierData *gpmd = (NoiseGpencilModifierData *)md;
+
+ if (gpmd->curve_intensity) {
+ write_curvemapping(wd, gpmd->curve_intensity);
+ }
+ }
else if (md->type == eGpencilModifierType_Hook) {
HookGpencilModifierData *gpmd = (HookGpencilModifierData *)md;
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
index a6e50362b34..ab39cbce709 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
@@ -27,6 +27,7 @@
#include "BLI_utildefines.h"
#include "BLI_math_vector.h"
+#include "BLI_ghash.h"
#include "BLI_hash.h"
#include "BLI_rand.h"
@@ -36,6 +37,7 @@
#include "DNA_gpencil_types.h"
#include "DNA_gpencil_modifier_types.h"
+#include "BKE_colortools.h"
#include "BKE_deform.h"
#include "BKE_gpencil.h"
#include "BKE_gpencil_modifier.h"
@@ -60,11 +62,35 @@ static void initData(GpencilModifierData *md)
gpmd->vgname[0] = '\0';
gpmd->step = 1;
gpmd->seed = 0;
+ gpmd->curve_intensity = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
+ if (gpmd->curve_intensity) {
+ /* TODO better default profile. */
+ BKE_curvemapping_initialize(gpmd->curve_intensity);
+ }
+}
+
+static void freeData(GpencilModifierData *md)
+{
+ NoiseGpencilModifierData *gpmd = (NoiseGpencilModifierData *)md;
+
+ if (gpmd->curve_intensity) {
+ BKE_curvemapping_free(gpmd->curve_intensity);
+ }
}
static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
{
+ NoiseGpencilModifierData *gmd = (NoiseGpencilModifierData *)md;
+ NoiseGpencilModifierData *tgmd = (NoiseGpencilModifierData *)target;
+
+ if (tgmd->curve_intensity != NULL) {
+ BKE_curvemapping_free(tgmd->curve_intensity);
+ tgmd->curve_intensity = NULL;
+ }
+
BKE_gpencil_modifier_copyData_generic(md, target);
+
+ tgmd->curve_intensity = BKE_curvemapping_copy(gmd->curve_intensity);
}
static bool dependsOnTime(GpencilModifierData *md)
@@ -82,15 +108,13 @@ static void deformStroke(GpencilModifierData *md,
bGPDstroke *gps)
{
NoiseGpencilModifierData *mmd = (NoiseGpencilModifierData *)md;
- bGPDspoint *pt0, *pt1;
MDeformVert *dvert = NULL;
- float shift, vran, vdir;
+ /* Noise value in range [-1..1] */
float normal[3];
float vec1[3], vec2[3];
- int sc_frame = 0;
- int stroke_seed = 0;
const int def_nr = defgroup_name_index(ob, mmd->vgname);
- const float unit_v3[3] = {1.0f, 1.0f, 1.0f};
+ const bool invert_group = (mmd->flag & GP_NOISE_INVERT_VGROUP) != 0;
+ const bool use_curve = (mmd->flag & GP_NOISE_CUSTOM_CURVE) != 0 && mmd->curve_intensity;
if (!is_stroke_affected_by_modifier(ob,
mmd->layername,
@@ -107,132 +131,80 @@ static void deformStroke(GpencilModifierData *md,
return;
}
- sc_frame = (int)DEG_get_ctime(depsgraph);
+ int seed = mmd->seed;
+ /* TODO Find a better seed for stroke. Ideally their position in the strokelist. */
+ int stroke_seed = gps->totpoints;
+ seed += stroke_seed;
+
+ /* FIXME Seed is the same for all modifier currently.
+ * This is a workaround to make sure different modifiers get different seeds. */
+ seed += BLI_hash_string(md->name);
- zero_v3(vec2);
+ if (mmd->flag & GP_NOISE_USE_RANDOM) {
+ seed += ((int)DEG_get_ctime(depsgraph)) / mmd->step;
+ }
/* calculate stroke normal*/
if (gps->totpoints > 2) {
BKE_gpencil_stroke_normal(gps, normal);
}
else {
- copy_v3_v3(normal, unit_v3);
+ copy_v3_fl(normal, 1.0f);
}
/* move points */
for (int i = 0; i < gps->totpoints; i++) {
- if (((i == 0) || (i == gps->totpoints - 1)) && ((mmd->flag & GP_NOISE_MOVE_EXTREME) == 0)) {
+ bGPDspoint *pt = &gps->points[i];
+ /* verify vertex group */
+ dvert = &gps->dvert[i];
+ float weight = get_modifier_point_weight(dvert, invert_group, def_nr);
+ if (weight < 0.0f) {
continue;
}
- /* first point is special */
- if (i == 0) {
- if (gps->dvert) {
- dvert = &gps->dvert[0];
- }
- pt0 = (gps->totpoints > 1) ? &gps->points[1] : &gps->points[0];
- pt1 = &gps->points[0];
- }
- else {
- int prev_idx = i - 1;
- CLAMP_MIN(prev_idx, 0);
- if (gps->dvert) {
- dvert = &gps->dvert[prev_idx];
- }
- pt0 = &gps->points[prev_idx];
- pt1 = &gps->points[i];
+ if (use_curve) {
+ float value = (float)i / (gps->totpoints - 1);
+ weight *= BKE_curvemapping_evaluateF(mmd->curve_intensity, 0, value);
}
- /* verify vertex group */
- const float weight = get_modifier_point_weight(
- dvert, (mmd->flag & GP_NOISE_INVERT_VGROUP) != 0, def_nr);
- if (weight < 0.0f) {
- continue;
- }
+ int point_seed = (mmd->flag & GP_NOISE_FULL_STROKE) ? seed : BLI_hash_int_2d(seed, i + 1);
- /* initial vector (p0 -> p1) */
- if (i == 0) {
+ if (mmd->factor > 0.0f) {
+ /* Offset point randomly around the normal vector. */
+ bGPDspoint *pt0 = (gps->totpoints > 1 && i < gps->totpoints - 1) ? &gps->points[i] :
+ &gps->points[i - 1];
+ bGPDspoint *pt1 = (gps->totpoints > 1 && i < gps->totpoints - 1) ? &gps->points[i + 1] :
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list