[Bf-blender-cvs] [040d763042a] greasepencil-object: WIP: Basic implementation of Opacity modifier

Antonio Vazquez noreply at git.blender.org
Mon Jul 24 11:27:55 CEST 2017


Commit: 040d763042aa2fcec8254f34dfc315034c61b7e6
Author: Antonio Vazquez
Date:   Mon Jul 24 10:44:38 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB040d763042aa2fcec8254f34dfc315034c61b7e6

WIP: Basic implementation of Opacity modifier

Still pending the target functionality.

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

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_gpencilopacity.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 00a5f4b73b9..559641013de 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1613,6 +1613,33 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         row = layout.row()
         row.prop(md, "create_colors")
 
+    def GP_OPACITY(self, layout, ob, md):
+        gpd = ob.grease_pencil
+        row = layout.row()
+        row.prop(md, "factor")
+
+        split = layout.split()
+        col = split.column()
+        col.label("Target:")
+        col.prop(md, "target", text="")
+        is_obj = md.target is not None
+        row = col.row()
+        row.enabled = is_obj
+        row.prop(md, "size")
+        row = col.row()
+        row.enabled = is_obj
+        row.prop(md, "falloff")
+        row.prop(md, "box_mode")
+
+        col = split.column()
+        col.label("Layer:")
+        row = col.row(align=True)
+        row.prop_search(md, "layer", gpd, "layers", text="", icon="GREASEPENCIL")
+        row.prop(md, "inverse_layers", text="", icon="ARROW_LEFTRIGHT")
+        row = col.row(align=True)
+        row.prop(md, "passindex", text="Pass")
+        row.prop(md, "inverse_pass", text="", icon="ARROW_LEFTRIGHT")
+
     def GP_ARRAY(self, layout, ob, md):
         split = layout.split()
         col = split.column()
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index b0907caa748..57161195119 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -49,6 +49,7 @@ struct GpencilThickModifierData;
 struct GpencilTintModifierData;
 struct GpencilArrayModifierData;
 struct GpencilDupliModifierData;
+struct GpencilOpacityModifierData;
 
 /* ------------ Grease-Pencil API ------------------ */
 
@@ -154,5 +155,6 @@ void ED_gpencil_thick_modifier(int id, struct GpencilThickModifierData *mmd, str
 void ED_gpencil_tint_modifier(int id, struct GpencilTintModifierData *mmd, 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);
 
 #endif /*  __BKE_GPENCIL_H__ */
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index bc021bfc67f..cfe38c45e98 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -1912,6 +1912,19 @@ void ED_gpencil_tint_modifier(int UNUSED(id), GpencilTintModifierData *mmd, bGPD
 	interp_v3_v3v3(gps->palcolor->fill, gps->palcolor->fill, mmd->rgb, mmd->factor);
 }
 
+/* opacity strokes */
+void ED_gpencil_opacity_modifier(int UNUSED(id), GpencilOpacityModifierData *mmd, bGPDlayer *gpl, bGPDstroke *gps)
+{
+	if (!is_stroke_affected_by_modifier(mmd->layername, mmd->passindex, 3, gpl, gps,
+		(int)mmd->flag & GP_OPACITY_INVERSE_LAYER, (int)mmd->flag & GP_OPACITY_INVERSE_PASS)) {
+		return;
+	}
+
+	gps->palcolor->rgb[3] = gps->palcolor->rgb[3] * mmd->factor;
+	gps->palcolor->fill[3] = gps->palcolor->fill[3] * mmd->factor;
+
+}
+
 /* helper function to sort strokes using qsort */
 static int gpencil_stroke_cache_compare(const void *a1, const void *a2)
 {
@@ -2109,6 +2122,10 @@ void ED_gpencil_stroke_modifiers(Object *ob, bGPDlayer *gpl, bGPDframe *gpf, bGP
 			case eModifierType_GpencilTint:
 				ED_gpencil_tint_modifier(id, (GpencilTintModifierData *)md, gpl, gps);
 				break;
+				// Tint
+			case eModifierType_GpencilOpacity:
+				ED_gpencil_opacity_modifier(id, (GpencilOpacityModifierData *)md, gpl, gps);
+				break;
 			}
 		}
 		++id;
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 7ff6ca387cc..15a519662d0 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -93,6 +93,7 @@ typedef enum ModifierType {
 	eModifierType_GpencilTint       = 57,
 	eModifierType_GpencilArray      = 58,
 	eModifierType_GpencilDupli      = 59,
+	eModifierType_GpencilOpacity    = 60,
 	NUM_MODIFIER_TYPES
 } ModifierType;
 
@@ -1686,6 +1687,24 @@ typedef enum eGpencilTint_Flag {
 	GP_TINT_INVERSE_PASS  = (1 << 2),
 } eGpencilTint_Flag;
 
+typedef struct GpencilOpacityModifierData {
+	ModifierData modifier;
+	struct Object *target;       /* target */
+	char layername[64];          /* layer name */
+	int passindex;               /* custom index for passes */
+	int flag;                    /* flags */
+	float factor;                /* Main Opacity factor */
+	float size;                  /* radius of focal area */
+	float falloff;               /* decay of opacity factor */
+	char pad[4];
+} GpencilOpacityModifierData;
+
+typedef enum eGpencilOpacity_Flag {
+	GP_OPACITY_INVERSE_LAYER  = (1 << 0),
+	GP_OPACITY_INVERSE_PASS   = (1 << 1),
+	GP_OPACITY_BOX_MODE       = (1 << 2),
+} eGpencilOpacity_Flag;
+
 typedef struct GpencilArrayModifierData {
 	ModifierData modifier;
 	int count[3];                /* number of elements in array */
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index 1983f1528f2..63088d1afe6 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -618,6 +618,7 @@ extern StructRNA RNA_GpencilThickModifier;
 extern StructRNA RNA_GpencilTintModifier;
 extern StructRNA RNA_GpencilArrayModifier;
 extern StructRNA RNA_GpencilDupliModifier;
+extern StructRNA RNA_GpencilOpacityModifier;
 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 4031a91a3ca..a7c21b283ac 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -127,6 +127,7 @@ EnumPropertyItem rna_enum_object_modifier_type_items[] = {
 	{eModifierType_GpencilSubdiv, "GP_SUBDIV", ICON_MOD_SUBSURF, "Subdivide", "Subdivide stroke adding more control points to strokes" },
 	{eModifierType_GpencilThick, "GP_THICK", ICON_MAN_ROT, "Thickness", "Change stroke thickness" },
 	{eModifierType_GpencilTint, "GP_TINT", ICON_COLOR, "Tint", "Tint strokes with new color" },
+	{eModifierType_GpencilOpacity, "GP_OPACITY", ICON_MOD_MASK, "Opacity", "Opacity of the strokes" },
 	{0, NULL, 0, NULL, NULL}
 };
 
@@ -440,6 +441,8 @@ static StructRNA *rna_Modifier_refine(struct PointerRNA *ptr)
 			return &RNA_GpencilArrayModifier;
 		case eModifierType_GpencilDupli:
 			return &RNA_GpencilDupliModifier;
+		case eModifierType_GpencilOpacity:
+			return &RNA_GpencilOpacityModifier;
 			/* Default */
 		case eModifierType_None:
 		case eModifierType_ShapeKey:
@@ -4991,6 +4994,69 @@ static void rna_def_modifier_gpenciltint(BlenderRNA *brna)
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
+static void rna_def_modifier_gpencilopacity(BlenderRNA *brna)
+{
+	StructRNA *srna;
+	PropertyRNA *prop;
+
+	srna = RNA_def_struct(brna, "GpencilOpacityModifier", "Modifier");
+	RNA_def_struct_ui_text(srna, "Opacity Modifier", "Opacity of Strokes modifier");
+	RNA_def_struct_sdna(srna, "GpencilOpacityModifierData");
+	RNA_def_struct_ui_icon(srna, ICON_MOD_MASK);
+
+	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, "factor", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_float_sdna(prop, NULL, "factor");
+	RNA_def_property_range(prop, 0, 1.0);
+	RNA_def_property_ui_text(prop, "Factor", "Factor for mixing color");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+	prop = RNA_def_property(srna, "falloff", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_float_sdna(prop, NULL, "falloff");
+	RNA_def_property_range(prop, 0, 1.0);
+	RNA_def_property_ui_text(prop, "Falloff", "Factor for gradient");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+	prop = RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_float_sdna(prop, NULL, "size");
+	RNA_def_property_range(prop, 0, FLT_MAX);
+	RNA_def_property_ui_text(prop, "Size", "Size of view area");
+	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");
+
+	prop = RNA_def_property(srna, "box_mode", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_OPACITY_BOX_MODE);
+	RNA_def_property_ui_text(prop, "Box", "Use rectangle shape for view area");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+	prop = RNA_def_property(srna, "inverse_layers", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_OPACITY_INVERSE_LAYER);
+	RNA_def_property_ui_text(prop, "Inverse Layers", "Inverse filter");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+	prop = RNA_def_property(srna, "inverse_pass", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_OPACITY_INVERSE_PASS);
+	RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+	prop = RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
+	RNA_def_property_pointer_sdna(prop, NULL, "target");
+	RNA_def_property_ui_text(prop, "Target", "Target object");
+	RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+	//RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update")

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list