[Bf-blender-cvs] [0845b1c8c8d] blender2.8: GP: Improve Subdivide and Simplify

Antonioya noreply at git.blender.org
Thu Aug 30 11:13:22 CEST 2018


Commit: 0845b1c8c8da818607fcff0a1bdb2114a0cb9729
Author: Antonioya
Date:   Thu Aug 30 11:06:44 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB0845b1c8c8da818607fcff0a1bdb2114a0cb9729

GP: Improve Subdivide and Simplify

Now the weights are managed in the operators.

The subdivide operator and modifier code have been replaced with a shared function.

Some cleanup also.

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

M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/blenkernel/intern/gpencil_modifier.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/editors/gpencil/gpencil_data.c
M	source/blender/editors/gpencil/gpencil_edit.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilsubdiv.c

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

diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 0aa7a0de7e6..aad02c371db 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -26,10 +26,10 @@
 #ifndef __BKE_GPENCIL_H__
 #define __BKE_GPENCIL_H__
 
-/** \file BKE_gpencil.h
- *  \ingroup bke
- *  \author Joshua Leung
- */
+ /** \file BKE_gpencil.h
+  *  \ingroup bke
+  *  \author Joshua Leung
+  */
 
 struct CurveMapping;
 struct Depsgraph;
@@ -106,9 +106,9 @@ void BKE_gpencil_stats_update(struct bGPdata *gpd);
 #define GP_PRIM_DATABUF_SIZE  5
 
 void BKE_gpencil_stroke_add_points(
-        struct bGPDstroke *gps,
-        const float *array, const int totpoints,
-        const float mat[4][4]);
+	struct bGPDstroke *gps,
+	const float *array, const int totpoints,
+	const float mat[4][4]);
 
 struct bGPDstroke *BKE_gpencil_add_stroke(struct bGPDframe *gpf, int mat_idx, int totpoints, short thickness);
 
@@ -144,8 +144,8 @@ struct Material *BKE_gpencil_material_ensure(struct Main *bmain, struct Object *
 
 /* object boundbox */
 bool BKE_gpencil_stroke_minmax(
-        const struct bGPDstroke *gps, const bool use_select,
-        float r_min[3], float r_max[3]);
+	const struct bGPDstroke *gps, const bool use_select,
+	float r_min[3], float r_max[3]);
 
 struct BoundBox *BKE_gpencil_boundbox_get(struct Object *ob);
 void BKE_gpencil_centroid_3D(struct bGPdata *gpd, float r_centroid[3]);
@@ -162,6 +162,7 @@ void BKE_gpencil_eval_geometry(struct Depsgraph *depsgraph, struct bGPdata *gpd)
 void BKE_gpencil_stroke_normal(const struct bGPDstroke *gps, float r_normal[3]);
 void BKE_gpencil_simplify_stroke(struct bGPDstroke *gps, float factor);
 void BKE_gpencil_simplify_fixed(struct bGPDstroke *gps);
+void BKE_gpencil_subdivide(struct bGPDstroke *gps, int level, int flag);
 
 void BKE_gpencil_transform(struct bGPdata *gpd, float mat[4][4]);
 
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c
index fd1170c1a9c..9c119e9776a 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -23,9 +23,9 @@
  * ***** END GPL LICENSE BLOCK *****
  */
 
-/** \file blender/blenkernel/intern/gpencil_modifier.c
- *  \ingroup bke
- */
+ /** \file blender/blenkernel/intern/gpencil_modifier.c
+  *  \ingroup bke
+  */
 
 
 #include <stdio.h>
@@ -241,6 +241,9 @@ static void gpencil_rdp_stroke(bGPDstroke *gps, vec2f *points2d, float epsilon)
 				dvert_src = &old_dvert[i];
 				MDeformVert *dvert = &gps->dvert[j];
 				memcpy(dvert, dvert_src, sizeof(MDeformVert));
+				if (dvert_src->dw) {
+					memcpy(dvert->dw, dvert_src->dw, sizeof(MDeformWeight));
+				}
 			}
 			j++;
 		}
@@ -314,6 +317,9 @@ void BKE_gpencil_simplify_fixed(bGPDstroke *gps)
 				dvert_src = &old_dvert[i];
 				MDeformVert *dvert = &gps->dvert[j];
 				memcpy(dvert, dvert_src, sizeof(MDeformVert));
+				if (dvert_src->dw) {
+					memcpy(dvert->dw, dvert_src->dw, sizeof(MDeformWeight));
+				}
 			}
 			j++;
 		}
@@ -341,7 +347,7 @@ void BKE_gpencil_simplify_fixed(bGPDstroke *gps)
  * each loop over all the geometry being evaluated.
  */
 
-/* init lattice deform data */
+ /* init lattice deform data */
 void BKE_gpencil_lattice_init(Object *ob)
 {
 	GpencilModifierData *md;
@@ -417,10 +423,11 @@ void BKE_gpencil_stroke_modifiers(Depsgraph *depsgraph, Object *ob, bGPDlayer *g
 				/* some modifiers could require a recalc of fill triangulation data */
 				if (gpd->flag & GP_DATA_STROKE_FORCE_RECALC) {
 					if (ELEM(md->type,
-					         eGpencilModifierType_Hook,
-					         eGpencilModifierType_Lattice,
-					         eGpencilModifierType_Offset))
-					{
+						eGpencilModifierType_Hook,
+						eGpencilModifierType_Lattice,
+						eGpencilModifierType_Noise,
+						eGpencilModifierType_Offset)) {
+
 						gps->flag |= GP_STROKE_RECALC_CACHES;
 					}
 				}
@@ -454,7 +461,7 @@ void BKE_gpencil_geometry_modifiers(Depsgraph *depsgraph, Object *ob, bGPDlayer
 /* *************************************************** */
 
 void BKE_gpencil_eval_geometry(Depsgraph *depsgraph,
-                               bGPdata *gpd)
+	bGPdata *gpd)
 {
 	DEG_debug_print_eval(depsgraph, __func__, gpd->id.name, gpd);
 	int ctime = (int)DEG_get_ctime(depsgraph);
@@ -468,10 +475,10 @@ void BKE_gpencil_eval_geometry(Depsgraph *depsgraph,
 	 * This would be better than inventing our own logic for this stuff...
 	 */
 
-	/* TODO: Move the following code to "BKE_gpencil_eval_done()" (marked as an exit node)
-	 * later when there's more happening here. For now, let's just keep this in here to avoid
-	 * needing to have one more node slowing down evaluation...
-	 */
+	 /* TODO: Move the following code to "BKE_gpencil_eval_done()" (marked as an exit node)
+	  * later when there's more happening here. For now, let's just keep this in here to avoid
+	  * needing to have one more node slowing down evaluation...
+	  */
 	if (DEG_is_active(depsgraph)) {
 		bGPdata *gpd_orig = (bGPdata *)DEG_get_original_id(&gpd->id);
 
@@ -706,3 +713,108 @@ void BKE_gpencil_instance_modifier_instance_tfm(InstanceGpencilModifierData *mmd
 	/* calculate matrix */
 	loc_eul_size_to_mat4(r_mat, offset, rot, scale);
 }
+
+void BKE_gpencil_subdivide(bGPDstroke *gps, int level, int flag)
+{
+	bGPDspoint *temp_points;
+	MDeformVert *temp_dverts = NULL;
+	MDeformVert *dvert = NULL;
+	MDeformVert *dvert_final = NULL;
+	MDeformVert *dvert_next = NULL;
+	int totnewpoints, oldtotpoints;
+	int i2;
+
+	for (int s = 0; s < 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);
+		if (gps->dvert != NULL) {
+			temp_dverts = MEM_dupallocN(gps->dvert);
+			gps->dvert = MEM_recallocN(gps->dvert, sizeof(*gps->dvert) * 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;
+
+			if (gps->dvert != NULL) {
+				dvert = &temp_dverts[i];
+				dvert_final = &gps->dvert[i2];
+				dvert_final->totweight = dvert->totweight;
+				dvert_final->dw = dvert->dw;
+			}
+			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);
+
+			if (gps->dvert != NULL) {
+				dvert = &temp_dverts[i];
+				dvert_next = &temp_dverts[i + 1];
+				dvert_final = &gps->dvert[i2];
+
+				dvert_final->totweight = dvert->totweight;
+				dvert_final->dw = MEM_dupallocN(dvert->dw);
+
+				/* interpolate weight values */
+				for (int d = 0; d < dvert->totweight; d++) {
+					MDeformWeight *dw_a = &dvert->dw[d];
+					if (dvert_next->totweight > d) {
+						MDeformWeight *dw_b = &dvert_next->dw[d];
+						MDeformWeight *dw_final = &dvert_final->dw[d];
+						dw_final->weight = interpf(dw_a->weight, dw_b->weight, 0.5f);
+					}
+				}
+			}
+
+			i2 += 2;
+		}
+
+		MEM_SAFE_FREE(temp_points);
+		MEM_SAFE_FREE(temp_dverts);
+
+		/* move points to smooth stroke (not simple flag )*/
+		if ((flag & GP_SUBDIV_SIMPLE) == 0) {
+			/* duplicate points in a temp area with the new subdivide data */
+			temp_points = MEM_dupallocN(gps->points);
+
+			/* extreme points are not changed */
+			for (int i = 0; i < gps->totpoints - 2; i++) {
+				bGPDspoint *pt = &temp_points[i];
+				bGPDspoint *next = &temp_points[i + 1];
+				bGPDspoint *pt_final = &gps->points[i + 1];
+
+				/* move point */
+				interp_v3_v3v3(&pt_final->x, &pt->x, &next->x, 0.5f);
+			}
+			/* free temp memory */
+			MEM_SAFE_FREE(temp_points);
+		}
+
+	}
+}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 1d030610bf2..d08dce5a144 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -6601,8 +6601,10 @@ static void direct_link_gpencil(FileData *fd, bGPdata *gpd)
 				gps->points = newdataadr(fd, gps->points);
 
 				/* relink weight data */
-				gps->dvert = newdataadr(fd, gps->dvert);
-				direct_link_dverts(fd, gps->totpoints, gps->dvert);
+				if (gps->dvert) {
+					gps->dvert = newdataadr(fd, gps->dvert);
+					direct_link_dverts(fd, gps->totpoints, gps->dvert);
+				}
 
 				/* the triangulation is not saved, so need to be recalculated */
 				gps->triangles = NULL;
diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c
index 3321bec3846..818a694a899 100644
--- a/source/blender/editors/gpencil/gpencil_data.c
+++ b/source/blender/editors/gpencil/gpencil_data.c
@@ -725,9 +725,6 @@ static int gp_frame_clean_loose_exec(bContext *C, wmOperator *op)
 				if (gpf == NULL)
 					continue;
 
-				if (gpf == NULL)
-					continue;
-
 				/* simply delete strokes which are no loose */
 				for (gps = gpf->strokes.first; gps; gps = gpsn) {
 					gpsn = gps->next;
diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c
index 3b2404415a7..021a4f74954 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -25,9 +25,9 @@
  * Operators for editing Grease Pencil strokes
  */
 
-/** \file blender/editors/gpencil/gpencil_edit.c
- *  \ingr

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list