[Bf-blender-cvs] [eb5a25f4bcc] greasepencil-object: GPencil: Modifier: Cleanup Multiple Stroke modifier UI & code
Clément Foucault
noreply at git.blender.org
Fri Mar 6 01:20:49 CET 2020
Commit: eb5a25f4bcc7417f9e97dc902b0af99099f32a01
Author: Clément Foucault
Date: Thu Mar 5 23:48:51 2020 +0100
Branches: greasepencil-object
https://developer.blender.org/rBeb5a25f4bcc7417f9e97dc902b0af99099f32a01
GPencil: Modifier: Cleanup Multiple Stroke modifier UI & code
- Reverse Opacity influence.
- Use BLI_listbase function to merge list (fixing a memleak)
- Some minor codestyle changes
===================================================================
M source/blender/blenloader/intern/versioning_280.c
M source/blender/gpencil_modifiers/intern/MOD_gpencilmultiply.c
M source/blender/makesrna/intern/rna_gpencil_modifier.c
===================================================================
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 97339ea2aea..64528129e9b 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -4634,6 +4634,11 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
break;
}
+ case eGpencilModifierType_Multiply: {
+ MultiplyGpencilModifierData *mmd = (MultiplyGpencilModifierData *)md;
+ mmd->fading_opacity = 1.0 - mmd->fading_opacity;
+ break;
+ }
case eGpencilModifierType_Subdiv: {
const short simple = (1 << 0);
SubdivGpencilModifierData *mmd = (SubdivGpencilModifierData *)md;
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilmultiply.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilmultiply.c
index aad0bad2f07..4f78bf8216a 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilmultiply.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilmultiply.c
@@ -67,7 +67,9 @@ static void initData(GpencilModifierData *md)
mmd->duplications = 3;
mmd->distance = 0.1f;
mmd->split_angle = DEG2RADF(1.0f);
- mmd->fading_opacity = 1.0f;
+ mmd->fading_center = 0.5f;
+ mmd->fading_thickness = 0.5f;
+ mmd->fading_opacity = 0.5f;
}
static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
@@ -99,36 +101,35 @@ static void splitStroke(bGPDframe *gpf, bGPDstroke *gps, float split_angle)
}
static void minter_v3_v3v3v3_ref(
- float *result, float *left, float *middle, float *right, float *stroke_normal)
+ float *result, float *prev, float *curr, float *next, float *stroke_normal)
{
- float left_arm[3], right_arm[3], inter1[3], inter2[3];
+ float vec[3], inter1[3], inter2[3];
float minter[3];
- if (left) {
- sub_v3_v3v3(left_arm, middle, left);
- cross_v3_v3v3(inter1, stroke_normal, left_arm);
+ if (prev) {
+ sub_v3_v3v3(vec, curr, prev);
+ cross_v3_v3v3(inter1, stroke_normal, vec);
}
- if (right) {
- sub_v3_v3v3(right_arm, right, middle);
- cross_v3_v3v3(inter2, stroke_normal, right_arm);
+ if (next) {
+ sub_v3_v3v3(vec, next, curr);
+ cross_v3_v3v3(inter2, stroke_normal, vec);
}
- if (!left) {
+ if (!prev) {
normalize_v3(inter2);
copy_v3_v3(result, inter2);
return;
}
-
- if (!right) {
+ if (!next) {
normalize_v3(inter1);
copy_v3_v3(result, inter1);
return;
}
-
interp_v3_v3v3(minter, inter1, inter2, 0.5);
normalize_v3(minter);
copy_v3_v3(result, minter);
}
-static void duplicateStroke(bGPDstroke *gps,
+static void duplicateStroke(Object *ob,
+ bGPDstroke *gps,
int count,
float dist,
float offset,
@@ -141,12 +142,13 @@ static void duplicateStroke(bGPDstroke *gps,
int i;
bGPDstroke *new_gps;
float stroke_normal[3];
- float minter[3];
bGPDspoint *pt;
- float offset_factor;
float thickness_factor;
float opacity_factor;
+ /* Apply object scale to offset distance. */
+ offset *= mat4_to_scale(ob->obmat);
+
BKE_gpencil_stroke_normal(gps, stroke_normal);
if (len_v3(stroke_normal) < FLT_EPSILON) {
add_v3_fl(stroke_normal, 1);
@@ -161,6 +163,7 @@ static void duplicateStroke(bGPDstroke *gps,
pt = gps->points;
for (int j = 0; j < gps->totpoints; j++) {
+ float minter[3];
if (j == 0) {
minter_v3_v3v3v3_ref(minter, NULL, &pt[j].x, &pt[j + 1].x, stroke_normal);
}
@@ -175,11 +178,11 @@ static void duplicateStroke(bGPDstroke *gps,
sub_v3_v3v3(&t2_array[j * 3], &pt[j].x, minter);
}
- /* This ensures the original stroke is the last one to be processed. */
+ /* This ensures the original stroke is the last one
+ * 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);
-
BLI_addtail(results, new_gps);
}
else {
@@ -188,28 +191,16 @@ static void duplicateStroke(bGPDstroke *gps,
pt = new_gps->points;
- if (count == 1) {
- offset_factor = 0;
- }
- else {
- offset_factor = (float)i / (float)(count - 1);
- }
+ float offset_fac = (count == 1) ? 0.5f : (i / (float)(count - 1));
if (fading) {
- thickness_factor = (offset_factor > fading_center) ?
- (interpf(1 - fading_thickness, 1.0f, offset_factor - fading_center)) :
- (interpf(
- 1.0f, 1 - fading_thickness, offset_factor - fading_center + 1));
- opacity_factor = (offset_factor > fading_center) ?
- (interpf(fading_opacity, 1.0f, offset_factor - fading_center)) :
- (interpf(1.0f, fading_opacity, offset_factor - fading_center + 1));
+ thickness_factor = interpf(1.0f - fading_thickness, 1.0f, fabsf(offset_fac - fading_center));
+ opacity_factor = interpf(1.0f - fading_opacity, 1.0f, fabsf(offset_fac - fading_center));
}
for (int j = 0; j < new_gps->totpoints; j++) {
- interp_v3_v3v3(&pt[j].x,
- &t1_array[j * 3],
- &t2_array[j * 3],
- interpf(1 + offset, offset, offset_factor));
+ float fac = interpf(1 + offset, offset, offset_fac);
+ interp_v3_v3v3(&pt[j].x, &t1_array[j * 3], &t2_array[j * 3], fac);
if (fading) {
pt[j].pressure = gps->points[j].pressure * thickness_factor;
pt[j].strength = gps->points[j].strength * opacity_factor;
@@ -228,7 +219,6 @@ static void bakeModifier(Main *UNUSED(bmain),
GpencilModifierData *md,
Object *ob)
{
-
bGPdata *gpd = ob->data;
LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
@@ -255,7 +245,8 @@ static void bakeModifier(Main *UNUSED(bmain),
splitStroke(gpf, gps, mmd->split_angle);
}
if (mmd->duplications > 0) {
- duplicateStroke(gps,
+ duplicateStroke(ob,
+ gps,
mmd->duplications,
mmd->distance,
mmd->offset,
@@ -266,10 +257,8 @@ static void bakeModifier(Main *UNUSED(bmain),
mmd->fading_opacity);
}
}
- if (duplicates.first) {
- ((bGPDstroke *)gpf->strokes.last)->next = duplicates.first;
- ((bGPDstroke *)duplicates.first)->prev = gpf->strokes.last;
- gpf->strokes.last = duplicates.first;
+ if (!BLI_listbase_is_empty(&duplicates)) {
+ BLI_movelisttolist(&gpf->strokes, &duplicates);
}
}
}
@@ -300,7 +289,8 @@ static void generate_geometry(GpencilModifierData *md, Object *ob, bGPDlayer *gp
splitStroke(gpf, gps, mmd->split_angle);
}
if (mmd->duplications > 0) {
- duplicateStroke(gps,
+ duplicateStroke(ob,
+ gps,
mmd->duplications,
mmd->distance,
mmd->offset,
@@ -311,10 +301,8 @@ static void generate_geometry(GpencilModifierData *md, Object *ob, bGPDlayer *gp
mmd->fading_opacity);
}
}
- if (duplicates.first) {
- ((bGPDstroke *)gpf->strokes.last)->next = duplicates.first;
- ((bGPDstroke *)duplicates.first)->prev = gpf->strokes.last;
- gpf->strokes.last = duplicates.first;
+ if (!BLI_listbase_is_empty(&duplicates)) {
+ BLI_movelisttolist(&gpf->strokes, &duplicates);
}
}
diff --git a/source/blender/makesrna/intern/rna_gpencil_modifier.c b/source/blender/makesrna/intern/rna_gpencil_modifier.c
index e43f2fd68ec..631544ae182 100644
--- a/source/blender/makesrna/intern/rna_gpencil_modifier.c
+++ b/source/blender/makesrna/intern/rna_gpencil_modifier.c
@@ -1943,7 +1943,8 @@ static void rna_def_modifier_gpencilmultiply(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_fade", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", GP_MULTIPLY_ENABLE_FADING);
- RNA_def_property_ui_text(prop, "Enable Fade", "Enable fade");
+ RNA_def_property_ui_text(
+ prop, "Enable Fade", "Fade the stroke thickness for each generated stroke");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
prop = RNA_def_property(srna, "split_angle", PROP_FLOAT, PROP_ANGLE);
@@ -1954,17 +1955,19 @@ static void rna_def_modifier_gpencilmultiply(BlenderRNA *brna)
prop = RNA_def_property(srna, "duplicates", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "duplications");
- RNA_def_property_range(prop, 0, 10);
+ RNA_def_property_range(prop, 0, 999);
+ RNA_def_property_ui_range(prop, 1, 10, 1, 1);
RNA_def_property_ui_text(prop, "Duplicates", "How many copies of strokes be displayed");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
- RNA_def_property_range(prop, 0, M_PI);
+ prop = RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE);
+ RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 0.01, 3);
RNA_def_property_ui_text(prop, "Distance", "Distance of duplications");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE);
- RNA_def_property_ui_range(prop, -1, 1, 0.1, 3);
+ RNA_def_property_ui_range(prop, -1, 1, 0.01, 3);
RNA_def_property_ui_text(prop, "Offset", "Offset of duplicates. -1 to 1: inner to outer");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
@@ -1980,8 +1983,9 @@ static void rna_def_modifier_gpencilmultiply(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Opacity", "Fade influence of stroke's opacity");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "fading_center", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "fading_center", PROP_FLOAT, PROP_FACTOR);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list