[Bf-blender-cvs] [87ff38cd9e6] greasepencil-object: More work on modifiers

Antonio Vazquez noreply at git.blender.org
Fri Jul 21 09:29:32 CEST 2017


Commit: 87ff38cd9e64bfddf38a0b9840579f71308a57d7
Author: Antonio Vazquez
Date:   Thu Jul 20 17:21:11 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB87ff38cd9e64bfddf38a0b9840579f71308a57d7

More work on modifiers

Complete rework, now the modifier data is saved in a cache and is not recalculated for each redrawing. The previous version had the problem the array strokes suffered of effect acumulation.

The array modifier is pending to add the rotation and scale parameters. Now only appear in UI panel but don't work.

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

M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/blenkernel/intern/gpencil.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
M	source/blender/editors/animation/anim_channels_edit.c
M	source/blender/modifiers/intern/MOD_gpencilarray.c
M	source/blender/modifiers/intern/MOD_gpencilnoise.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/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 7d74266d805..9b81649c858 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -49,10 +49,14 @@ struct GpencilThickModifierData;
 struct GpencilTintModifierData;
 struct GpencilArrayModifierData;
 
+#define GP_MOD_DUPLI_ON 1
+#define GP_MOD_DUPLI_OFF 0
+
 /* ------------ Grease-Pencil API ------------------ */
 
 void BKE_gpencil_free_stroke(struct bGPDstroke *gps);
 bool BKE_gpencil_free_strokes(struct bGPDframe *gpf);
+bool BKE_gpencil_free_layer_temp_data(struct bGPDlayer *gpl);
 void BKE_gpencil_free_frames(struct bGPDlayer *gpl);
 void BKE_gpencil_free_layers(struct ListBase *list);
 void BKE_gpencil_free_brushes(struct ListBase *list);
@@ -71,6 +75,7 @@ struct bGPDlayer *BKE_gpencil_layer_addnew(struct bGPdata *gpd, const char *name
 struct bGPdata   *BKE_gpencil_data_addnew(const char name[]);
 
 struct bGPDframe *BKE_gpencil_frame_duplicate(const struct bGPDframe *gpf_src);
+struct bGPDframe *BKE_gpencil_frame_color_duplicate(const struct bGPDframe *gpf_src);
 struct bGPDlayer *BKE_gpencil_layer_duplicate(const struct bGPDlayer *gpl_src);
 struct bGPdata   *BKE_gpencil_data_duplicate(struct Main *bmain, const struct bGPdata *gpd, bool internal_copy);
 
@@ -137,11 +142,12 @@ void BKE_gpencil_palettecolor_delete_allstrokes(struct PaletteColor *palcolor);
 struct BoundBox *BKE_gpencil_boundbox_get(struct Object *ob);
 
 /* modifiers */
-void ED_gpencil_stroke_modifiers(struct Object *ob, struct bGPDlayer *gpl, struct bGPDframe *gpf, 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);
-void ED_gpencil_thick_modifier(struct GpencilThickModifierData *mmd, struct bGPDlayer *gpl, struct bGPDstroke *gps);
-void ED_gpencil_tint_modifier(struct GpencilTintModifierData *mmd, struct bGPDlayer *gpl, struct bGPDstroke *gps);
+void ED_gpencil_stroke_modifiers(struct Object *ob, struct bGPDlayer *gpl, struct bGPDframe *gpf, struct bGPDstroke *gps, int duplimode);
+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_array_modifier(int id, struct GpencilArrayModifierData *mmd, struct bGPDlayer *gpl, struct bGPDframe *gpf, struct bGPDstroke *gps);
 
 #endif /*  __BKE_GPENCIL_H__ */
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index 983ad984169..fc98c8fbbf6 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -60,6 +60,9 @@
 #include "BKE_main.h"
 #include "BKE_object.h"
 
+#define GP_MOD_DUPLI_ON 1
+#define GP_MOD_DUPLI_OFF 0
+
  /* Draw Engine */
 void(*BKE_gpencil_batch_cache_dirty_cb)(bGPdata *gpd) = NULL;
 void(*BKE_gpencil_batch_cache_free_cb)(bGPdata *gpd) = NULL;
@@ -115,6 +118,28 @@ bool BKE_gpencil_free_strokes(bGPDframe *gpf)
 	return changed;
 }
 
+/* Free strokes and colors belonging to a gp-frame */
+bool BKE_gpencil_free_layer_temp_data(bGPDlayer *gpl)
+{
+	bGPDstroke *gps_next;
+	bGPDframe *gpf = gpl->derived_gpf;
+	if (!gpf) {
+		return false;
+	}
+
+	/* free strokes */
+	for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps_next) {
+		gps_next = gps->next;
+		MEM_SAFE_FREE(gps->palcolor);
+		BKE_gpencil_free_stroke(gps);
+	}
+	BLI_listbase_clear(&gpf->strokes);
+
+	MEM_SAFE_FREE(gpf);
+
+	return true;
+}
+
 /* Free all of a gp-layer's frames */
 void BKE_gpencil_free_frames(bGPDlayer *gpl)
 {
@@ -200,10 +225,10 @@ void BKE_gpencil_free_brushes(ListBase *list)
 void BKE_gpencil_free_layers(ListBase *list)
 {
 	bGPDlayer *gpl_next;
-	
+
 	/* error checking */
 	if (list == NULL) return;
-	
+
 	/* delete layers */
 	for (bGPDlayer *gpl = list->first; gpl; gpl = gpl_next) {
 		gpl_next = gpl->next;
@@ -214,6 +239,21 @@ void BKE_gpencil_free_layers(ListBase *list)
 	}
 }
 
+/* Free all of the gp-layers temp data*/
+static void BKE_gpencil_free_layers_temp_data(ListBase *list)
+{
+	bGPDlayer *gpl_next;
+
+	/* error checking */
+	if (list == NULL) return;
+	/* delete layers */
+	for (bGPDlayer *gpl = list->first; gpl; gpl = gpl_next) {
+		gpl_next = gpl->next;
+
+		BKE_gpencil_free_layer_temp_data(gpl);
+	}
+}
+
 /** Free (or release) any data used by this grease pencil (does not free the gpencil itself). */
 void BKE_gpencil_free(bGPdata *gpd, bool free_all)
 {
@@ -221,6 +261,9 @@ void BKE_gpencil_free(bGPdata *gpd, bool free_all)
 	BKE_animdata_free(&gpd->id, false);
 
 	/* free layers */
+	if (free_all) {
+		BKE_gpencil_free_layers_temp_data(&gpd->layers);
+	}
 	BKE_gpencil_free_layers(&gpd->layers);
 
 	/* free all data */
@@ -710,6 +753,35 @@ bGPDframe *BKE_gpencil_frame_duplicate(const bGPDframe *gpf_src)
 	return gpf_dst;
 }
 
+/* make a copy of a given gpencil frame and copy colors too */
+bGPDframe *BKE_gpencil_frame_color_duplicate(const bGPDframe *gpf_src)
+{
+	bGPDstroke *gps_dst;
+	bGPDframe *gpf_dst;
+
+	/* error checking */
+	if (gpf_src == NULL) {
+		return NULL;
+	}
+
+	/* make a copy of the source frame */
+	gpf_dst = MEM_dupallocN(gpf_src);
+	gpf_dst->prev = gpf_dst->next = NULL;
+
+	/* copy strokes */
+	BLI_listbase_clear(&gpf_dst->strokes);
+	for (bGPDstroke *gps_src = gpf_src->strokes.first; gps_src; gps_src = gps_src->next) {
+		/* make copy of source stroke */
+		gps_dst = MEM_dupallocN(gps_src);
+		gps_dst->points = MEM_dupallocN(gps_src->points);
+		gps_dst->triangles = MEM_dupallocN(gps_src->triangles);
+		gps_dst->palcolor = MEM_dupallocN(gps_src->palcolor);
+		BLI_addtail(&gpf_dst->strokes, gps_dst);
+	}
+	/* return new frame */
+	return gpf_dst;
+}
+
 /* make a copy of a given gpencil brush */
 bGPDbrush *BKE_gpencil_brush_duplicate(const bGPDbrush *brush_src)
 {
@@ -1117,6 +1189,7 @@ void BKE_gpencil_layer_delete(bGPdata *gpd, bGPDlayer *gpl)
 	
 	/* free layer */
 	BKE_gpencil_free_frames(gpl);
+	BKE_gpencil_free_layer_temp_data(gpl);
 	BLI_freelinkN(&gpd->layers, gpl);
 }
 
@@ -1527,7 +1600,8 @@ BoundBox *BKE_gpencil_boundbox_get(Object *ob)
 
 /********************  Modifiers **********************************/
 /* verify if valid layer and pass index */
-static bool is_stroke_affected_by_modifier(char *mlayername, int mpassindex, int minpoints, bGPDlayer *gpl, bGPDstroke *gps, int inv1, int inv2)
+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 */
 	if (mlayername[0] != '\0') {
@@ -1559,11 +1633,11 @@ static bool is_stroke_affected_by_modifier(char *mlayername, int mpassindex, int
 		return false;
 	}
 
-	return true;;
+	return true;
 }
 
 /* calculate stroke normal using some points */
-static void ED_gpencil_stroke_normal(const bGPDstroke *gps, float r_normal[3])
+void ED_gpencil_stroke_normal(const bGPDstroke *gps, float r_normal[3])
 {
 	if (gps->totpoints < 3) {
 		zero_v3(r_normal);
@@ -1594,7 +1668,7 @@ static void ED_gpencil_stroke_normal(const bGPDstroke *gps, float r_normal[3])
 }
 
 /* calculate a noise base on stroke direction */
-void ED_gpencil_noise_modifier(GpencilNoiseModifierData *mmd, bGPDlayer *gpl, bGPDstroke *gps)
+void ED_gpencil_noise_modifier(int UNUSED(id), GpencilNoiseModifierData *mmd, bGPDlayer *gpl, bGPDstroke *gps)
 {
 	bGPDspoint *pt0, *pt1;
 	float shift, vran, vdir;
@@ -1711,7 +1785,7 @@ 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)
+void ED_gpencil_subdiv_modifier(int UNUSED(id), GpencilSubdivModifierData *mmd, bGPDlayer *gpl, bGPDstroke *gps)
 {
 	bGPDspoint *temp_points;
 	int totnewpoints, oldtotpoints;
@@ -1786,7 +1860,7 @@ void ED_gpencil_subdiv_modifier(GpencilSubdivModifierData *mmd, bGPDlayer *gpl,
 }
 
 /* change stroke thickness */
-void ED_gpencil_thick_modifier(GpencilThickModifierData *mmd, bGPDlayer *gpl, bGPDstroke *gps)
+void ED_gpencil_thick_modifier(int UNUSED(id), GpencilThickModifierData *mmd, bGPDlayer *gpl, bGPDstroke *gps)
 {
 	if (!is_stroke_affected_by_modifier(mmd->layername, mmd->passindex, 3, gpl, gps,
 		(int)mmd->flag & GP_THICK_INVERSE_LAYER, (int)mmd->flag & GP_THICK_INVERSE_PASS)) {
@@ -1797,7 +1871,7 @@ void ED_gpencil_thick_modifier(GpencilThickModifierData *mmd, bGPDlayer *gpl, bG
 }
 
 /* tint strokes */
-void ED_gpencil_tint_modifier(GpencilTintModifierData *mmd, bGPDlayer *gpl, bGPDstroke *gps)
+void ED_gpencil_tint_modifier(int UNUSED(id), GpencilTintModifierData *mmd, bGPDlayer *gpl, bGPDstroke *gps)
 {
 	if (!is_stroke_affected_by_modifier(mmd->layername, mmd->passindex, 3, gpl, gps,
 		(int)mmd->flag & GP_TINT_INVERSE_LAYER, (int)mmd->flag & GP_TINT_INVERSE_PASS)) {
@@ -1813,71 +1887,97 @@ void ED_gpencil_array_modifier(int id, GpencilArrayModifierData *mmd, bGPDlayer
 {
 	bGPDspoint *pt;
 	bGPDstroke *gps_dst, *old_gps;
-	float offset[3];
+	float offset[3], zerov3[3];
+	float minv[3], maxv[3], centroid[3];
+	float mat[4][4];
+	int i;
+	zero_v3(zerov3);
 
 	if (!is_stroke_affected_by_modifier(mmd->layername, mmd->passindex, 3, gpl, gps,
 		(int)mmd->flag & GP_ARRAY_INVERSE_LAYER, (int)mmd->flag & GP_ARRAY_INVERSE_PASS)) {
 		return;
 	}
 
-	/* if temp do not apply if was created by previous modifier to avoid infinite loop */
+	/* if temp do not apply if modifier is before current */
 	if (gps->flag & GP_STROKE_TEMP) {
 		if (gps->mod_idx <= id) {
-			return;
+			return false;
 		}
 	}
 
 	old_gps = gps;
+	/* get cent

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list