[Bf-blender-cvs] [76ffc76b406] greasepencil-object: WIP: Add hash for derived frame

Antonio Vazquez noreply at git.blender.org
Wed Jul 26 16:30:19 CEST 2017


Commit: 76ffc76b406564b52f8d715523d478f805ef5ac5
Author: Antonio Vazquez
Date:   Wed Jul 26 12:02:29 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB76ffc76b406564b52f8d715523d478f805ef5ac5

WIP: Add hash for derived frame

This is the first step to allow multi-user datablock

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

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/draw/engines/gpencil/gpencil_engine.c
M	source/blender/makesdna/DNA_gpencil_types.h

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

diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 861da789d88..a55478e693d 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -56,7 +56,7 @@ struct GpencilOpacityModifierData;
 
 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);
+bool BKE_gpencil_free_layer_temp_data(struct bGPDlayer *gpl, struct bGPDframe *derived_gpf);
 void BKE_gpencil_free_frames(struct bGPDlayer *gpl);
 void BKE_gpencil_free_layers(struct ListBase *list);
 void BKE_gpencil_free_derived_frames(struct bGPdata *gpd);
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index 73c1a0b6cc0..741b72d470f 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -42,6 +42,7 @@
 #include "BLI_math_color.h"
 #include "BLI_string_utils.h"
 #include "BLI_rand.h"
+#include "BLI_ghash.h"
 
 #include "BLT_translation.h"
 
@@ -124,23 +125,22 @@ bool BKE_gpencil_free_strokes(bGPDframe *gpf)
 }
 
 /* Free strokes and colors belonging to a gp-frame */
-bool BKE_gpencil_free_layer_temp_data(bGPDlayer *gpl)
+bool BKE_gpencil_free_layer_temp_data(bGPDlayer *gpl, bGPDframe *derived_gpf)
 {
 	bGPDstroke *gps_next;
-	bGPDframe *gpf = gpl->derived_gpf;
-	if (!gpf) {
+	if (!derived_gpf) {
 		return false;
 	}
 
 	/* free strokes */
-	for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps_next) {
+	for (bGPDstroke *gps = derived_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);
+	BLI_listbase_clear(&derived_gpf->strokes);
 
-	MEM_SAFE_FREE(gpf);
+	MEM_SAFE_FREE(derived_gpf);
 
 	return true;
 }
@@ -244,6 +244,20 @@ void BKE_gpencil_free_layers(ListBase *list)
 	}
 }
 
+/* clear all runtime derived data */
+static void BKE_gpencil_clear_derived(bGPDlayer *gpl)
+{
+	GHashIterator *ihash = BLI_ghashIterator_new(gpl->derived_data);
+	while (!BLI_ghashIterator_done(ihash)) {
+		bGPDframe *gpf = (bGPDframe *) BLI_ghashIterator_getValue(ihash);
+		if (gpf) {
+			BKE_gpencil_free_layer_temp_data(gpl, gpf);
+		}
+		BLI_ghashIterator_step(ihash);
+	}
+	BLI_ghashIterator_free(ihash);
+}
+
 /* Free all of the gp-layers temp data*/
 static void BKE_gpencil_free_layers_temp_data(ListBase *list)
 {
@@ -254,8 +268,10 @@ static void BKE_gpencil_free_layers_temp_data(ListBase *list)
 	/* delete layers */
 	for (bGPDlayer *gpl = list->first; gpl; gpl = gpl_next) {
 		gpl_next = gpl->next;
+		BKE_gpencil_clear_derived(gpl);
 
-		BKE_gpencil_free_layer_temp_data(gpl);
+		BLI_ghash_free(gpl->derived_data, NULL, NULL);
+		gpl->derived_data = NULL;
 	}
 }
 
@@ -265,13 +281,10 @@ void BKE_gpencil_free_derived_frames(bGPdata *gpd)
 	/* error checking */
 	if (gpd == NULL) return;
 	for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
-		if (gpl->derived_gpf) {
-			for (bGPDstroke *gps = gpl->derived_gpf->strokes.first; gps; gps = gps->next) {
-				MEM_SAFE_FREE(gps->palcolor);
-			}
-			BKE_gpencil_free_strokes(gpl->derived_gpf);
-			MEM_SAFE_FREE(gpl->derived_gpf);
-		}
+		BKE_gpencil_clear_derived(gpl);
+
+		BLI_ghash_free(gpl->derived_data, NULL, NULL);
+		gpl->derived_data = NULL;
 	}
 }
 
@@ -867,7 +880,7 @@ bGPDlayer *BKE_gpencil_layer_duplicate(const bGPDlayer *gpl_src)
 	/* make a copy of source layer */
 	gpl_dst = MEM_dupallocN(gpl_src);
 	gpl_dst->prev = gpl_dst->next = NULL;
-	gpl_dst->derived_gpf = NULL;
+	gpl_dst->derived_data = NULL;
 	
 	/* copy frames */
 	BLI_listbase_clear(&gpl_dst->frames);
@@ -1211,7 +1224,12 @@ void BKE_gpencil_layer_delete(bGPdata *gpd, bGPDlayer *gpl)
 	
 	/* free layer */
 	BKE_gpencil_free_frames(gpl);
-	BKE_gpencil_free_layer_temp_data(gpl);
+	
+	/* free derived data */
+	BKE_gpencil_clear_derived(gpl);
+	BLI_ghash_free(gpl->derived_data, NULL, NULL);
+	gpl->derived_data = NULL;
+
 	BLI_freelinkN(&gpd->layers, gpl);
 }
 
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index e5131614839..d52218be929 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -6604,7 +6604,7 @@ static void direct_link_gpencil(FileData *fd, bGPdata *gpd)
 		/* relink frames */
 		link_list(fd, &gpl->frames);
 		gpl->actframe = newdataadr(fd, gpl->actframe);
-		gpl->derived_gpf = NULL;
+		gpl->derived_data = NULL;
 		
 		for (gpf = gpl->frames.first; gpf; gpf = gpf->next) {
 			/* relink strokes (and their points) */
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 9311cea4ffc..4f9f4dec499 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -781,14 +781,23 @@ void DRW_gpencil_populate_datablock(GPENCIL_e_data *e_data, void *vedata, Scene
 		bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, CFRA, 0);
 		if (gpf == NULL)
 			continue;
+		/* create GHash if need */
+		if (gpl->derived_data == NULL) {
+			gpl->derived_data = (GHash *) BLI_ghash_str_new(gpl->info);
+		}
+
 		if ((ob->modifiers.first) && (!is_edit)) {
-			if (cache->is_dirty) {
+			bGPDframe *derived_gpf;
+			derived_gpf = (bGPDframe *) BLI_ghash_lookup(gpl->derived_data, ob->id.name);
+			if (derived_gpf != NULL) {
 				/* first clear temp data */
-				BKE_gpencil_free_layer_temp_data(gpl);
-				/* create new data */
-				gpl->derived_gpf = BKE_gpencil_frame_color_duplicate(gpf);
+				BLI_ghash_remove(gpl->derived_data, ob->id.name, NULL, NULL);
+				BKE_gpencil_free_layer_temp_data(gpl, derived_gpf);
 			}
-			temp_gpf = gpl->derived_gpf;
+			/* create new data */
+			derived_gpf = BKE_gpencil_frame_color_duplicate(gpf);
+			BLI_ghash_insert(gpl->derived_data, ob->id.name, derived_gpf);
+			temp_gpf = derived_gpf;
 		}
 		else {
 			temp_gpf = gpf; 
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 06038d10ef9..5ee0f04e4f5 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -247,19 +247,27 @@ static void GPENCIL_cache_finish(void *vedata)
 			/* save init shading group */
 			stl->g_data->gp_object_cache[i].init_grp = stl->storage->shgroup_id;
 			
-			/* add to hash to avoid duplicate geometry cache*/
-			if (!BLI_ghash_lookup(stl->g_data->gpd_in_cache, ob->gpd->id.name)) {
-				BLI_ghash_insert(stl->g_data->gpd_in_cache, ob->gpd->id.name, ob->gpd);
-				if (ob->gpd->flag & (GP_DATA_STROKE_EDITMODE | GP_DATA_STROKE_SCULPTMODE)) {
-					ob->gpd->flag |= GP_DATA_CACHE_IS_DIRTY;
-					ob->gpd->flag &= ~GP_DATA_CACHE_REUSE;
-				}
+#if 0
+			/* if use modifiers in several objects, always dirty */
+			if ((ob->modifiers.first) && (((ID *)ob->gpd)->us > 1)) {
+				ob->gpd->flag |= GP_DATA_CACHE_IS_DIRTY;
+				ob->gpd->flag &= ~GP_DATA_CACHE_REUSE;
 			}
 			else {
-				ob->gpd->flag &= ~GP_DATA_CACHE_IS_DIRTY;
-				ob->gpd->flag |= GP_DATA_CACHE_REUSE;
+				/* add to hash to avoid duplicate geometry cache*/
+				if (!BLI_ghash_lookup(stl->g_data->gpd_in_cache, ob->gpd->id.name)) {
+					BLI_ghash_insert(stl->g_data->gpd_in_cache, ob->gpd->id.name, ob->gpd);
+					if (ob->gpd->flag & (GP_DATA_STROKE_EDITMODE | GP_DATA_STROKE_SCULPTMODE)) {
+						ob->gpd->flag |= GP_DATA_CACHE_IS_DIRTY;
+						ob->gpd->flag &= ~GP_DATA_CACHE_REUSE;
+					}
+				}
+				else {
+					ob->gpd->flag &= ~GP_DATA_CACHE_IS_DIRTY;
+					ob->gpd->flag |= GP_DATA_CACHE_REUSE;
+				}
 			}
-
+#endif
 			/* fill shading groups */
 			DRW_gpencil_populate_datablock(&e_data, vedata, scene, ob, ts, ob->gpd);
 
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index 0f9e74eca7c..825a981c095 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -36,6 +36,7 @@
 
 struct AnimData;
 struct CurveMapping;
+struct GHash;
 
 /* TODO: add size as userprefs parameter */
 #define GP_OBGPENCIL_DEFAULT_SIZE  0.5f 
@@ -257,7 +258,7 @@ typedef struct bGPDlayer {
 	
 	float tintcolor[4];     /* Color used to tint layer, alpha value is used as factor */
 	float opacity;          /* Opacity of the layer */
-	bGPDframe *derived_gpf; /* runtime data created by modifiers */
+	struct GHash *derived_data;     /* runtime data created by modifiers */
 } bGPDlayer;
 
 /* bGPDlayer->flag */




More information about the Bf-blender-cvs mailing list