[Bf-blender-cvs] [b424845bb5e] greasepencil-object: New subdivide stroke modifier

Antonio Vazquez noreply at git.blender.org
Sun Jul 16 17:43:30 CEST 2017


Commit: b424845bb5ef450b8b73de5ae2327221ea8427a8
Author: Antonio Vazquez
Date:   Sun Jul 16 17:40:29 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rBb424845bb5ef450b8b73de5ae2327221ea8427a8

New subdivide stroke modifier

This modifier add intermediary points to stroke to get more control points for other modifiers as Noise.

This is not a subsurf modifier. This will be a different one.

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

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/RNA_access.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/CMakeLists.txt
M	source/blender/modifiers/MOD_modifiertypes.h
A	source/blender/modifiers/intern/MOD_gpencilsubdiv.c
M	source/blender/modifiers/intern/MOD_util.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 169ec07c6b3..011c7a4fdb7 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1549,6 +1549,19 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         row.prop(md, "affect_strength", text="Strength", icon='COLOR', toggle=True)
         row.prop(md, "affect_thickness", text="Thickness", icon='LINE_DATA', toggle=True)
 
+    def GP_SUBDIV(self, layout, ob, md):
+        gpd = ob.grease_pencil
+        split = layout.split()
+
+        col = split.column()
+        row = col.row(align=True)
+        row.prop(md, "level")
+        col.prop(md, "passindex", text="Pass")
+
+        col = split.column()
+        col.label("Layer:")
+        col.prop_search(md, "layer", gpd, "layers", text="", icon="GREASEPENCIL")
+
 classes = (
     DATA_PT_modifiers,
 )
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index e0e2da5dd8b..958ae44fead 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -44,6 +44,7 @@ struct PaletteColor;
 struct BoundBox;
 struct Object;
 struct GpencilNoiseModifierData;
+struct GpencilSubdivModifierData;
 
 /* ------------ Grease-Pencil API ------------------ */
 
@@ -135,5 +136,6 @@ struct BoundBox *BKE_gpencil_boundbox_get(struct Object *ob);
 /* modifiers */
 void ED_gpencil_stroke_modifiers(struct Object *ob, struct bGPDlayer *gpl, struct bGPDstroke *gps);
 void ED_gpencil_noise_modifier(struct GpencilNoiseModifierData *mmd, struct bGPDlayer *gpl, struct bGPDstroke *gps);
+void ED_gpencil_subdiv_modifier(struct GpencilSubdivModifierData *mmd, 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 391debf63d3..ce13e385114 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -1640,6 +1640,73 @@ void ED_gpencil_noise_modifier(GpencilNoiseModifierData *mmd, bGPDlayer *gpl, bG
 	}
 }
 
+/* subdivide stroke to get more control points */
+void ED_gpencil_subdiv_modifier(GpencilSubdivModifierData *mmd, bGPDlayer *gpl, bGPDstroke *gps)
+{
+	bGPDspoint *temp_points;
+	int totnewpoints, oldtotpoints;
+	int i2;
+
+	if (gps->totpoints < 2) {
+		return;
+	}
+	/* omit if filter by layer */
+	if (mmd->layername[0] != '\0') {
+		if (!STREQ(mmd->layername, gpl->info)) {
+			return;
+		}
+	}
+	/* verify pass */
+	if (gps->palcolor->index != mmd->passindex) {
+		return;
+	}
+
+	/* loop as many times as levels */
+	for (int s = 0; s < mmd->level; s++) {
+		totnewpoints = gps->totpoints - 1;
+		/* duplicate points in a temp area */
+		temp_points = MEM_dupallocN(gps->points);
+		oldtotpoints = gps->totpoints;
+
+		/* resize the points arrys */
+		gps->totpoints += totnewpoints;
+		gps->points = MEM_recallocN(gps->points, sizeof(*gps->points) * gps->totpoints);
+		gps->flag |= GP_STROKE_RECALC_CACHES;
+
+		/* move points from last to first to new place */
+		i2 = gps->totpoints - 1;
+		for (int i = oldtotpoints - 1; i > 0; i--) {
+			bGPDspoint *pt = &temp_points[i];
+			bGPDspoint *pt_final = &gps->points[i2];
+
+			copy_v3_v3(&pt_final->x, &pt->x);
+			pt_final->pressure = pt->pressure;
+			pt_final->strength = pt->strength;
+			pt_final->time = pt->time;
+			pt_final->flag = pt->flag;
+			i2 -= 2;
+		}
+		/* interpolate mid points */
+		i2 = 1;
+		for (int i = 0; i < oldtotpoints - 1; i++) {
+			bGPDspoint *pt = &temp_points[i];
+			bGPDspoint *next = &temp_points[i + 1];
+			bGPDspoint *pt_final = &gps->points[i2];
+
+			/* add a half way point */
+			interp_v3_v3v3(&pt_final->x, &pt->x, &next->x, 0.5f);
+			pt_final->pressure = interpf(pt->pressure, next->pressure, 0.5f);
+			pt_final->strength = interpf(pt->strength, next->strength, 0.5f);
+			CLAMP(pt_final->strength, GPENCIL_STRENGTH_MIN, 1.0f);
+			pt_final->time = interpf(pt->time, next->time, 0.5f);
+			i2 += 2;
+		}
+
+		/* free temp memory */
+		MEM_SAFE_FREE(temp_points);
+	}
+}
+
 /* apply stroke modifiers */
 void ED_gpencil_stroke_modifiers(Object *ob, bGPDlayer *gpl, bGPDstroke *gps)
 {
@@ -1649,10 +1716,14 @@ void ED_gpencil_stroke_modifiers(Object *ob, bGPDlayer *gpl, bGPDstroke *gps)
 		if (((md->mode & eModifierMode_Realtime) && ((G.f & G_RENDER_OGL) == 0)) ||
 			((md->mode & eModifierMode_Render) && (G.f & G_RENDER_OGL))) {
 			switch (md->type) {
-				// Noise Modifier
+			// Noise Modifier
 			case eModifierType_GpencilNoise:
 				ED_gpencil_noise_modifier((GpencilNoiseModifierData *)md, gpl, gps);
 				break;
+				// Noise Modifier
+			case eModifierType_GpencilSubdiv:
+				ED_gpencil_subdiv_modifier((GpencilSubdivModifierData *)md, gpl, gps);
+				break;
 			default:
 				break;
 			}
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index cf17bd38220..b44eb1a79d0 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -88,6 +88,7 @@ typedef enum ModifierType {
 	eModifierType_MeshSequenceCache = 52,
 	eModifierType_SurfaceDeform     = 53,
 	eModifierType_GpencilNoise      = 54,
+	eModifierType_GpencilSubdiv     = 55,
 	NUM_MODIFIER_TYPES
 } ModifierType;
 
@@ -1622,12 +1623,22 @@ typedef struct GpencilNoiseModifierData {
 	char pad[4];
 } GpencilNoiseModifierData;
 
-typedef enum eGpencilNoise_Flag {
+typedef enum eGpencilSubdiv_Flag {
 	GP_NOISE_USE_RANDOM     = (1 << 0),
 	GP_NOISE_MOD_LOCATION   = (1 << 1),
 	GP_NOISE_MOD_STRENGTH   = (1 << 2),
 	GP_NOISE_MOD_THICKNESS  = (1 << 3),
-} eGpencilNoise_Flag;
+} eGpencilSubdiv_Flag;
+
+
+typedef struct GpencilSubdivModifierData {
+	ModifierData modifier;
+	char layername[64];          /* layer name */
+	int passindex;               /* custom index for passes */
+	int flag;                    /* flags */
+	int level;                   /* factor of subdivision */
+	char pad[4];
+} GpencilSubdivModifierData;
 
 #define MOD_MESHSEQ_READ_ALL \
 	(MOD_MESHSEQ_READ_VERT | MOD_MESHSEQ_READ_POLY | MOD_MESHSEQ_READ_UV | MOD_MESHSEQ_READ_COLOR)
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index fe4343de58b..2af0b827248 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -613,6 +613,7 @@ extern StructRNA RNA_SurfaceCurve;
 extern StructRNA RNA_SurfaceDeformModifier;
 extern StructRNA RNA_SurfaceModifier;
 extern StructRNA RNA_GpencilNoiseModifier;
+extern StructRNA RNA_GpencilSubdivModifier;
 extern StructRNA RNA_TexMapping;
 extern StructRNA RNA_Text;
 extern StructRNA RNA_TextBox;
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 4eb1ad1c611..a2dd7e0fbec 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -122,6 +122,7 @@ EnumPropertyItem rna_enum_object_modifier_type_items[] = {
 	{eModifierType_Surface, "SURFACE", ICON_MOD_PHYSICS, "Surface", ""},
 	{0, "", 0, N_("Grease Pencil"), "" },
 	{eModifierType_GpencilNoise, "GP_NOISE", ICON_RNDCURVE, "Noise", "Add noise to strokes" },
+	{eModifierType_GpencilSubdiv, "GP_SUBDIV", ICON_PARTICLE_POINT, "Subdivide", "Add more control points to strokes" },
 	{0, NULL, 0, NULL, NULL}
 };
 
@@ -418,7 +419,9 @@ static StructRNA *rna_Modifier_refine(struct PointerRNA *ptr)
 			return &RNA_SurfaceDeformModifier;
 		case eModifierType_GpencilNoise:
 			return &RNA_GpencilNoiseModifier;
-			/* Default */
+		case eModifierType_GpencilSubdiv:
+			return &RNA_GpencilSubdivModifier;
+		/* Default */
 		case eModifierType_None:
 		case eModifierType_ShapeKey:
 		case NUM_MODIFIER_TYPES:
@@ -4779,7 +4782,7 @@ static void rna_def_modifier_gpencilnoise(BlenderRNA *brna)
 	RNA_def_property_ui_text(prop, "Layer", "Layer name");
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
-	prop = RNA_def_property(srna, "factor", PROP_FLOAT, PROP_TIME);
+	prop = RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE);
 	RNA_def_property_float_sdna(prop, NULL, "factor");
 	RNA_def_property_range(prop, 0, 30.0);
 	RNA_def_property_ui_text(prop, "Factor", "Amount of noise to apply");
@@ -4812,6 +4815,34 @@ static void rna_def_modifier_gpencilnoise(BlenderRNA *brna)
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
+static void rna_def_modifier_gpencilsubdiv(BlenderRNA *brna)
+{
+	StructRNA *srna;
+	PropertyRNA *prop;
+
+	srna = RNA_def_struct(brna, "GpencilSubdivModifier", "Modifier");
+	RNA_def_struct_ui_text(srna, "Subdivision Modifier", "Subdivide Stroke modifier");
+	RNA_def_struct_sdna(srna, "GpencilSubdivModifierData");
+	RNA_def_struct_ui_icon(srna, ICON_PARTICLE_POINT);
+
+	prop = RNA_def_property(srna, "layer", PROP_STRING, PROP_NONE);
+	RNA_def_property_string_sdna(prop, NULL, "layername");
+	RNA_def_property_ui_text(prop, "Layer", "Layer name");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+	prop = RNA_def_property(srna, "level", PROP_INT, PROP_NONE);
+	RNA_def_property_int_sdna(prop, NULL, "level");
+	RNA_def_property_range(prop, 1, 5);
+	RNA_def_property_ui_text(prop, "Level", "Number of subdivisions");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+	prop = RNA_def_property(srna, "passindex", PROP_INT, PROP_NONE);
+	RNA_def_property_int_sdna(prop, NULL, "passindex");
+	RNA_def_property_range(prop, 0, 100);
+	RNA_def_property_ui_text(prop, "Pass", "Pass index");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+}
+
 void RNA_def_modifier(BlenderRNA *brna)
 {
 	StructRNA *srna;
@@ -4931,6 +4962,7 @@ void RNA_def_modifier(BlenderRNA *brna)
 	rna_def_modifier_meshseqcache(brna);
 	rna_def_modifier_surfacedeform(brna);
 	rna_def_modifier_gpencilnoise(brna);
+	rna_def_modifier_gpencilsubdiv(brna);
 }
 
 #endif
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt
index b189ea77c2d..c83d112ede2 100644
--- a/source/blender/modifiers/CMakeLists.txt
+++ b/source/blender/modifiers/CMakeLists.txt


@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list