[Bf-blender-cvs] [bf83610263a] greasepencil-object: WIP: More work for vertexgroups

Antonio Vazquez noreply at git.blender.org
Mon Jul 31 13:19:34 CEST 2017


Commit: bf83610263a36a6219ffb0f08ea1b71db08423ba
Author: Antonio Vazquez
Date:   Mon Jul 31 10:15:50 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rBbf83610263a36a6219ffb0f08ea1b71db08423ba

WIP: More work for vertexgroups

Apply vertexgroups to modifiers

===================================================================

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/blenkernel/intern/gpencil.c
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_gpencilcolor.c
M	source/blender/modifiers/intern/MOD_gpencildupli.c
M	source/blender/modifiers/intern/MOD_gpencillattice.c
M	source/blender/modifiers/intern/MOD_gpencilnoise.c
M	source/blender/modifiers/intern/MOD_gpencilopacity.c
M	source/blender/modifiers/intern/MOD_gpencilsubdiv.c
M	source/blender/modifiers/intern/MOD_gpencilthick.c
M	source/blender/modifiers/intern/MOD_gpenciltint.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 4cf1351fcb2..f96bcc50890 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1547,6 +1547,12 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         row = col.row(align=True)
         row.prop_search(md, "layer", gpd, "layers", text="", icon="GREASEPENCIL")
         row.prop(md, "inverse_layers", text="", icon="ARROW_LEFTRIGHT")
+
+        col.label("Vertex Group:")
+        row = col.row(align=True)
+        row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+        row.prop(md, "inverse_vertex", text="", icon="ARROW_LEFTRIGHT")
+
         row = col.row(align=True)
         row.prop(md, "passindex", text="Pass")
         row.prop(md, "inverse_pass", text="", icon="ARROW_LEFTRIGHT")
@@ -1593,6 +1599,11 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         row.prop_search(md, "layer", gpd, "layers", text="", icon="GREASEPENCIL")
         row.prop(md, "inverse_layers", text="", icon="ARROW_LEFTRIGHT")
 
+        col.label("Vertex Group:")
+        row = col.row(align=True)
+        row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+        row.prop(md, "inverse_vertex", text="", icon="ARROW_LEFTRIGHT")
+
     def GP_TINT(self, layout, ob, md):
         gpd = ob.grease_pencil
         split = layout.split()
@@ -1648,6 +1659,12 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         row = col.row(align=True)
         row.prop_search(md, "layer", gpd, "layers", text="", icon="GREASEPENCIL")
         row.prop(md, "inverse_layers", text="", icon="ARROW_LEFTRIGHT")
+
+        col.label("Vertex Group:")
+        row = col.row(align=True)
+        row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+        row.prop(md, "inverse_vertex", text="", icon="ARROW_LEFTRIGHT")
+
         row = col.row(align=True)
         row.prop(md, "passindex", text="Pass")
         row.prop(md, "inverse_pass", text="", icon="ARROW_LEFTRIGHT")
@@ -1735,6 +1752,12 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         row = col.row(align=True)
         row.prop_search(md, "layer", gpd, "layers", text="", icon="GREASEPENCIL")
         row.prop(md, "inverse_layers", text="", icon="ARROW_LEFTRIGHT")
+
+        col.label("Vertex Group:")
+        row = col.row(align=True)
+        row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+        row.prop(md, "inverse_vertex", text="", icon="ARROW_LEFTRIGHT")
+
         row = col.row(align=True)
         row.prop(md, "passindex", text="Pass")
         row.prop(md, "inverse_pass", text="", icon="ARROW_LEFTRIGHT")
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index b77aa009cfc..a51a8a49b33 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -161,17 +161,17 @@ void ED_gpencil_stroke_modifiers(struct Object *ob, struct bGPDlayer *gpl, struc
 void ED_gpencil_geometry_modifiers(struct Object *ob, struct bGPDlayer *gpl, struct bGPDframe *gpf);
 void ED_gpencil_fill_random_array(float *ar, int count);
 void ED_gpencil_stroke_normal(const struct bGPDstroke *gps, float r_normal[3]);
-void ED_gpencil_noise_modifier(int id, struct GpencilNoiseModifierData *mmd, struct bGPDlayer *gpl, struct bGPDstroke *gps);
-void ED_gpencil_subdiv_modifier(int id, struct GpencilSubdivModifierData *mmd, struct bGPDlayer *gpl, struct bGPDstroke *gps);
-void ED_gpencil_thick_modifier(int id, struct GpencilThickModifierData *mmd, struct bGPDlayer *gpl, struct bGPDstroke *gps);
-void ED_gpencil_tint_modifier(int id, struct GpencilTintModifierData *mmd, struct bGPDlayer *gpl, struct bGPDstroke *gps);
-void ED_gpencil_color_modifier(int id, struct GpencilColorModifierData *mmd, struct bGPDlayer *gpl, struct bGPDstroke *gps);
+void ED_gpencil_noise_modifier(int id, struct GpencilNoiseModifierData *mmd, struct Object *ob, struct bGPDlayer *gpl, struct bGPDstroke *gps);
+void ED_gpencil_subdiv_modifier(int id, struct GpencilSubdivModifierData *mmd, struct Object *ob, struct bGPDlayer *gpl, struct bGPDstroke *gps);
+void ED_gpencil_thick_modifier(int id, struct GpencilThickModifierData *mmd, struct Object *ob, struct bGPDlayer *gpl, struct bGPDstroke *gps);
+void ED_gpencil_tint_modifier(int id, struct GpencilTintModifierData *mmd, struct Object *ob, struct bGPDlayer *gpl, struct bGPDstroke *gps);
+void ED_gpencil_color_modifier(int id, struct GpencilColorModifierData *mmd, struct Object *ob, struct bGPDlayer *gpl, struct bGPDstroke *gps);
 void ED_gpencil_array_modifier(int id, struct GpencilArrayModifierData *mmd, struct Object *ob, int elem_idx[3], float r_mat[4][4]);
-void ED_gpencil_dupli_modifier(int id, struct GpencilDupliModifierData *mmd, struct bGPDlayer *gpl, struct bGPDframe *gpf);
-void ED_gpencil_opacity_modifier(int id, struct GpencilOpacityModifierData *mmd, struct bGPDlayer *gpl, struct bGPDstroke *gps);
+void ED_gpencil_dupli_modifier(int id, struct GpencilDupliModifierData *mmd, struct Object *ob, struct bGPDlayer *gpl, struct bGPDframe *gpf);
+void ED_gpencil_opacity_modifier(int id, struct GpencilOpacityModifierData *mmd, struct Object *ob, struct bGPDlayer *gpl, struct bGPDstroke *gps);
 
 bool ED_gpencil_use_this_lattice(struct Object *ob, struct Object *lattice);
 void ED_gpencil_lattice_init(struct Object *ob);
-void ED_gpencil_lattice_modifier(int id, struct GpencilLatticeModifierData *mmd, struct bGPDlayer *gpl, struct bGPDstroke *gps);
+void ED_gpencil_lattice_modifier(int id, struct GpencilLatticeModifierData *mmd, struct Object *ob, struct bGPDlayer *gpl, struct bGPDstroke *gps);
 
 #endif /*  __BKE_GPENCIL_H__ */
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index c4a49ad05a0..6f3dec76203 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -1796,7 +1796,7 @@ void ED_gpencil_fill_random_array(float *ar, int count)
 }
 
 /* verify if valid layer and pass index */
-static bool is_stroke_affected_by_modifier(char *mlayername, int mpassindex, int minpoints, 
+static bool is_stroke_affected_by_modifier(char *mlayername, int mpassindex, int minpoints,
 	bGPDlayer *gpl, bGPDstroke *gps, int inv1, int inv2)
 {
 	/* omit if filter by layer */
@@ -1825,7 +1825,6 @@ static bool is_stroke_affected_by_modifier(char *mlayername, int mpassindex, int
 			}
 		}
 	}
-
 	/* need to have a minimum number of points */
 	if ((minpoints > 0) && (gps->totpoints < minpoints)) {
 		return false;
@@ -1834,6 +1833,46 @@ static bool is_stroke_affected_by_modifier(char *mlayername, int mpassindex, int
 	return true;
 }
 
+/* verify if valid vertex group *and return weight */
+static float is_point_affected_by_modifier(bGPDspoint *pt, int inverse, int vindex)
+{
+	float weight = 1.0f;
+
+	if (vindex >= 0) {
+		weight = BKE_gpencil_vgroup_use_index(pt, vindex);
+		if ((weight >= 0.0f) && (inverse == 1)) {
+			return -1.0f;
+		}
+
+		if ((weight < 0.0f) && (inverse == 0)) {
+			return -1.0f;
+		}
+
+		/* if inverse, weight is always 1 */
+		if ((weight < 0.0f) && (inverse == 1)) {
+			return 1.0f;
+		}
+
+	}
+
+	return weight;
+}
+
+/* get the vertex group index or -1 if empty */
+static int get_vertex_group_index(Object *ob, char *vgname)
+{
+	int vindex = -1;
+	/* get vertex group index */
+	if (vgname[0] != '\0') {
+		bDeformGroup *defgrp = BLI_findstring(&ob->defbase, vgname, offsetof(bDeformGroup, name));
+		if (defgrp) {
+			vindex = BLI_findindex(&ob->defbase, defgrp);
+		}
+	}
+	
+	return vindex;
+}
+
 /* calculate stroke normal using some points */
 void ED_gpencil_stroke_normal(const bGPDstroke *gps, float r_normal[3])
 {
@@ -1866,7 +1905,7 @@ void ED_gpencil_stroke_normal(const bGPDstroke *gps, float r_normal[3])
 }
 
 /* calculate a noise base on stroke direction */
-void ED_gpencil_noise_modifier(int UNUSED(id), GpencilNoiseModifierData *mmd, bGPDlayer *gpl, bGPDstroke *gps)
+void ED_gpencil_noise_modifier(int UNUSED(id), GpencilNoiseModifierData *mmd, Object *ob, bGPDlayer *gpl, bGPDstroke *gps)
 {
 	bGPDspoint *pt0, *pt1;
 	float shift, vran, vdir;
@@ -1875,6 +1914,8 @@ void ED_gpencil_noise_modifier(int UNUSED(id), GpencilNoiseModifierData *mmd, bG
 	Scene *scene = NULL;
 	int sc_frame = 0;
 	int sc_diff = 0;
+	int vindex = get_vertex_group_index(ob, mmd->vgname);
+	float weight = 1.0f;
 
 	if (!is_stroke_affected_by_modifier(mmd->layername, mmd->passindex, 3, gpl, gps, 
 		(int) mmd->flag & GP_NOISE_INVERSE_LAYER, (int)mmd->flag & GP_NOISE_INVERSE_PASS)) {
@@ -1905,6 +1946,12 @@ void ED_gpencil_noise_modifier(int UNUSED(id), GpencilNoiseModifierData *mmd, bG
 			pt0 = &gps->points[i - 1];
 			pt1 = &gps->points[i];
 		}
+		/* verify vertex group */
+		weight = is_point_affected_by_modifier(pt0, (int)(!(mmd->flag & GP_NOISE_INVERSE_VGROUP) == 0), vindex);
+		if (weight < 0) {
+			continue;
+		}
+
 		/* initial vector (p0 -> p1) */
 		sub_v3_v3v3(vec1, &pt1->x, &pt0->x);
 		vran = len_v3(vec1);
@@ -1948,7 +1995,7 @@ void ED_gpencil_noise_modifier(int UNUSED(id), GpencilNoiseModifierData *mmd, bG
 		/* apply randomness to location of the point */
 		if (mmd->flag & GP_NOISE_MOD_LOCATION) {
 			/* factor is too sensitive, so need divide */
-			shift = vran * mmd->factor / 10.0f;
+			shift = (vran * mmd->factor / 10.0f) * weight;
 			if (vdir > 0.5f) {
 				mul_v3_fl(vec2, shift);
 			}
@@ -1983,13 +2030,13 @@ void ED_gpencil_noise_modifier(int UNUSED(id), GpencilNoiseModifierData *mmd, bG
 }
 
 /* subdivide stroke to get more control points */
-void ED_gpencil_subdiv_modifier(int UNUSED(id), GpencilSubdivModifierData *mmd, bGPDlayer *gpl, bGPDstroke *gps)
+void ED_gpencil_subdiv_modifier(int UNUSED(id), GpencilSubdivModifierData *mmd, Object *UNUSED(ob), bGPDlayer *gpl, bGPDstroke *gps)
 {
 	bGPDspoint *temp_points;
 	int totnewpoints, oldtotpoints;
 	int i2;
 
-	if (!is_stroke_affected_by_modifier(mmd->layername, mmd->passindex, 3, gpl, gps,
+	if (!is_stroke_affected_by_modifier(mmd->layername,mmd->passindex, 3, gpl, gps,
 		(int)mmd->

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list