[Bf-blender-cvs] [b7ad3ea653d] greasepencil-object: GP Modifiers - Merge Array and Duplication modifiers

Joshua Leung noreply at git.blender.org
Sat Nov 4 05:48:28 CET 2017


Commit: b7ad3ea653d4b118d31d5c256997b6fcb2aed720
Author: Joshua Leung
Date:   Fri Nov 3 03:45:30 2017 +1300
Branches: greasepencil-object
https://developer.blender.org/rBb7ad3ea653d4b118d31d5c256997b6fcb2aed720

GP Modifiers - Merge Array and Duplication modifiers

Array and Duplication modifiers basically implemented the same functionality,
except that:
1) Array was slightly more powerful (i.e. it could make a 3D grid instead of
   just putting everything in a single line), and
2) Array created new objects when "Applying", while Duplication added to the
   current datablock

This commit basically merges the functionality of both into the Array modifier.
I ended up recoding this modifier to hopefully work a lot faster.
* The resulting modifier more closely resembles the behaviour of the normal
  Blender Array modifier.
* Performance should be better now with over 25 objects (previous array modifier
  implementation lagged badly with more than 25-30 instances). The previous approach
  of manually creating objects didn't work too well.

TODO:
* The functionality to disable the instance creation when the simplify options
  are enabled is currently lost. Still need to figure out how to restore it
* The stubs/shell for the old Duplication modifier are still around. To be removed!

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

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/blenkernel/intern/gpencil_modifier.c
M	source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
M	source/blender/draw/engines/gpencil/gpencil_engine.c
M	source/blender/draw/engines/gpencil/gpencil_engine.h
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_gpencilarray.c
M	source/blender/modifiers/intern/MOD_gpencildupli.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 7491d8170a7..d5cc261040c 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1741,6 +1741,18 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         row.prop(md, "random_scale", text="", icon="TIME", toggle=True)
         row.prop(md, "scale_factor", text="")
 
+        split = layout.split()
+        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, "pass_index", text="Pass")
+        row.prop(md, "inverse_pass", text="", icon="ARROW_LEFTRIGHT")
+
+        row.row(md, "use_make_objects")
+
     def GP_DUPLI(self, layout, ob, md):
         gpd = ob.grease_pencil
         layout.prop(md, "count")
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index d2de9597a2f..da4b5cfad60 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -202,8 +202,6 @@ void BKE_gpencil_geometry_modifiers(struct Object *ob, struct bGPDlayer *gpl, st
 void BKE_gpencil_stroke_normal(const struct bGPDstroke *gps, float r_normal[3]);
 
 void BKE_gpencil_simplify_modifier(int id, struct GpencilSimplifyModifierData *mmd, struct Object *ob, struct bGPDlayer *gpl, struct bGPDstroke *gps);
-void BKE_gpencil_array_modifier(int id, struct GpencilArrayModifierData *mmd, struct Object *ob, int elem_idx[3], float r_mat[4][4]);
-void BKE_gpencil_dupli_modifier(int id, struct GpencilDupliModifierData *mmd, struct Object *ob, struct bGPDlayer *gpl, struct bGPDframe *gpf);
 
 /* (wrapper api) simplify stroke using Ramer-Douglas-Peucker algorithm */
 void BKE_gpencil_simplify_stroke(struct bGPDlayer *gpl, struct bGPDstroke *gps, float factor);
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c
index 4dce7ab4b36..61170d88a6f 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -56,11 +56,6 @@
 // XXX: temp transitional code
 #include "../../modifiers/intern/MOD_gpencil_util.h"
 
-/* used to save temp strokes */
-typedef struct tGPencilStrokeCache {
-	struct bGPDstroke *gps;
-	int idx;
-} tGPencilStrokeCache;
 
 /* temp data for simplify modifier */
 typedef struct tbGPDspoint {
@@ -98,154 +93,7 @@ void BKE_gpencil_stroke_normal(const bGPDstroke *gps, float r_normal[3])
 	normalize_v3(r_normal);
 }
 
-/* helper function to sort strokes using qsort */
-static int gpencil_stroke_cache_compare(const void *a1, const void *a2)
-{
-	const tGPencilStrokeCache *ps1 = a1, *ps2 = a2;
-
-	if (ps1->idx < ps2->idx) return -1;
-	else if (ps1->idx > ps2->idx) return 1;
-
-	return 0;
-}
 
-/* dupli modifier */
-void BKE_gpencil_dupli_modifier(
-        int id, GpencilDupliModifierData *mmd, Object *UNUSED(ob), bGPDlayer *gpl, bGPDframe *gpf)
-{
-	bGPDspoint *pt;
-	bGPDstroke *gps_dst;
-	struct tGPencilStrokeCache *stroke_cache, *p = NULL;
-	float offset[3], rot[3], scale[3];
-	float mat[4][4];
-	float factor;
-	int ri;
-
-	/* create cache for sorting */
-	int totstrokes = BLI_listbase_count(&gpf->strokes);
-	int cachesize =  totstrokes * mmd->count;
-	p = MEM_callocN(sizeof(struct tGPencilStrokeCache) * cachesize, "tGPencilStrokeCache");
-	if (p) {
-		stroke_cache = p;
-	}
-	else {
-		return;
-	}
-
-	int stroke = 0;
-	int idx = 0;
-	for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
-		stroke++;
-		if (!is_stroke_affected_by_modifier(
-		        mmd->layername, mmd->pass_index, 1, gpl, gps,
-		        mmd->flag & GP_DUPLI_INVERSE_LAYER, mmd->flag & GP_DUPLI_INVERSE_PASS))
-		{
-			continue;
-		}
-
-		for (int e = 0; e < mmd->count; e++) {
-			/* duplicate stroke */
-			gps_dst = MEM_dupallocN(gps);
-			if (id > -1) {
-				gps_dst->palcolor = MEM_dupallocN(gps->palcolor);
-			}
-			gps_dst->points = MEM_dupallocN(gps->points);
-			BKE_gpencil_stroke_weights_duplicate(gps, gps_dst);
-
-			gps_dst->triangles = MEM_dupallocN(gps->triangles);
-
-			/* add to array for sorting later */
-			stroke_cache[idx].gps = gps_dst;
-			stroke_cache[idx].idx = (e * 100000) + stroke;
-
-			mul_v3_v3fl(offset, mmd->offset, e + 1);
-			ri = mmd->rnd[0];
-			/* rotation */
-			if (mmd->flag & GP_DUPLI_RANDOM_ROT) {
-				factor = mmd->rnd_rot * mmd->rnd[ri];
-				mul_v3_v3fl(rot, mmd->rot, factor);
-				add_v3_v3(rot, mmd->rot);
-			}
-			else {
-				copy_v3_v3(rot, mmd->rot);
-			}
-			/* scale */
-			if (mmd->flag & GP_DUPLI_RANDOM_SIZE) {
-				factor = mmd->rnd_size * mmd->rnd[ri];
-				mul_v3_v3fl(scale, mmd->scale, factor);
-				add_v3_v3(scale, mmd->scale);
-			}
-			else {
-				copy_v3_v3(scale, mmd->scale);
-			}
-			/* move random index */
-			mmd->rnd[0]++;
-			if (mmd->rnd[0] > 19) {
-				mmd->rnd[0] = 1;
-			}
-
-			loc_eul_size_to_mat4(mat, offset, rot, scale);
-
-			/* move points */
-			for (int i = 0; i < gps->totpoints; i++) {
-				pt = &gps_dst->points[i];
-				mul_m4_v3(mat, &pt->x);
-			}
-			idx++;
-		}
-	}
-	/* sort by idx */
-	qsort(stroke_cache, idx, sizeof(tGPencilStrokeCache), gpencil_stroke_cache_compare);
-	
-	/* add to listbase */
-	for (int i = 0; i < idx; i++) {
-		BLI_addtail(&gpf->strokes, stroke_cache[i].gps);
-	}
-
-	/* free memory */
-	MEM_SAFE_FREE(stroke_cache);
-}
-
-/* array modifier */
-void BKE_gpencil_array_modifier(
-        int UNUSED(id), GpencilArrayModifierData *mmd, Object *UNUSED(ob), int elem_idx[3], float r_mat[4][4])
-{
-	float offset[3], rot[3], scale[3];
-	float factor;
-	int ri;
-
-	offset[0] = mmd->offset[0] * elem_idx[0];
-	offset[1] = mmd->offset[1] * elem_idx[1];
-	offset[2] = mmd->offset[2] * elem_idx[2];
-
-	ri = mmd->rnd[0];
-	/* rotation */
-	if (mmd->flag & GP_ARRAY_RANDOM_ROT) {
-		factor = mmd->rnd_rot * mmd->rnd[ri];
-		mul_v3_v3fl(rot, mmd->rot, factor);
-		add_v3_v3(rot, mmd->rot);
-	}
-	else {
-		copy_v3_v3(rot, mmd->rot);
-	}
-	/* scale */
-	if (mmd->flag & GP_ARRAY_RANDOM_SIZE) {
-		factor = mmd->rnd_size * mmd->rnd[ri];
-		mul_v3_v3fl(scale, mmd->scale, factor);
-		add_v3_v3(scale, mmd->scale);
-	}
-	else {
-		copy_v3_v3(scale, mmd->scale);
-	}
-	/* move random index */
-	mmd->rnd[0]++;
-	if (mmd->rnd[0] > 19) {
-		mmd->rnd[0] = 1;
-	}
-	/* calculate matrix */
-	loc_eul_size_to_mat4(r_mat, offset, rot, scale);
-
-}
 
 /* init lattice deform data */
 void BKE_gpencil_lattice_init(Object *ob)
@@ -526,11 +374,6 @@ bool BKE_gpencil_has_geometry_modifiers(Object *ob)
 		if (mti->generateStrokes) {
 			return true;
 		}
-			
-		// XXX: Remove
-		if (md->type == eModifierType_GpencilDupli) {
-			return true;
-		}
 	}
 	return false;
 }
@@ -596,14 +439,6 @@ void BKE_gpencil_geometry_modifiers(Object *ob, bGPDlayer *gpl, bGPDframe *gpf)
 				EvaluationContext eval_ctx = {0}; /* XXX */
 				mti->generateStrokes(md, &eval_ctx, ob, gpl, gpf, id);
 			}
-
-			// XXX: The following lines need to all be converted to modifier callbacks...
-			switch (md->type) {
-				// Array
-				case eModifierType_GpencilDupli:
-					BKE_gpencil_dupli_modifier(id, (GpencilDupliModifierData *)md, ob, gpl, gpf);
-					break;
-			}
 		}
 		id++;
 	}
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
index 4df3eb49b5d..8557ccad3cd 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -1196,63 +1196,4 @@ struct GPUTexture *DRW_gpencil_create_blank_texture(int width, int height)
 	return tex;
 }
 
-/* create instances using array modifiers */
-void gpencil_array_modifiers(GPENCIL_StorageList *stl, Object *ob)
-{
-	ModifierData *md;
-	GpencilArrayModifierData *mmd;
-	Object *newob = NULL;
-	bGPdata *gpd = NULL;
-	int x, y, z;
-	int xyz[3];
-	int sh;
-	float mat[4][4];
-
-	if ((ob) && (ob->data)) {
-		gpd = ob->data;
-		if (GPENCIL_ANY_EDIT_MODE(gpd)) {
-			return;
-		}
-	}
-
-	for (md = ob->modifiers.first; md; md = md->next) {
-		if (((md->mode & eModifierMode_Realtime) && ((G.f & G_RENDER_OGL) == 0)) ||
-		    ((md->mode & eModifierMode_Render) && (G.f & G_RENDER_OGL)))
-		{
-			if (md->type == eModifierType_GpencilArray) {
-				mmd = (GpencilArrayModifierData *)md;
-				/* reset random */
-				mmd->rnd[0] = 1;
-				for (x = 0; x < mmd->count[0]; x++) {
-					for (y = 0; y < mmd->count[1]; y++) {
-						for (z = 0; z < mmd->count[2]; z++) {
-							ARRAY_SET_ITEMS(xyz, x, y, z);
-							if ((x == 0) && (y == 0) && (z == 0)) {
-								continue;
-							}
-							BKE_gpencil_array_modifier(0, mmd, ob, xyz, mat);
-							/* add object to cache */
-							newob = MEM_dupallocN(ob);
-							newob->mode = -1; /* use this mark to delete later */
-							mul_m4_m4m4(newob->obmat, mat, ob->obmat);
-							/* apply scale */
-							ARRAY_SET_ITEMS(newob->size, mat[0][0], mat[1][1], mat[2][2]);
-							/* apply shift */
-							sh = x;
-							if (mmd->lock_axis == GP_LOCKAXIS_Y) {
-								sh = y;
-							}
-							if (mmd->lock_axis == GP_LOCKAXIS_Z) {
-								sh = z;
-							}
-							madd_v3_v3fl(newob->obmat[3], mmd->shift, sh);
-							stl->g_data->gp_object_cache = gpencil_object_cache_allocate(stl->g_data->gp_object_cache, &stl->g_data->gp_cache_size, &stl->g_data->gp_cache_used);
-							gpencil_object_cache_add(stl->g_data->gp_object_cache, newob, &stl->g_data->gp_cache_used);
-						}
-					}
-				}
-			}
-		}
-	}
 
-}
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 56d5c6da7ff..1e114b74ab7 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -410,10 +410,6 @@ static void GPENCIL_cache_populate(void *vedata, Object *ob)
 			stl->g_data->gp_object_cache = gpencil_object_cache_allocate(stl->g_data->gp_object_cache, &stl->g_data->gp_cache_size, &

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list