[Bf-blender-cvs] [8d3e2af8775] greasepencil-object: Grease Pencil: Fix problems linking object with Pallete

Dalai Felinto noreply at git.blender.org
Tue Jun 13 16:00:55 CEST 2017


Commit: 8d3e2af8775e8a778f923583e455f412897fa204
Author: Dalai Felinto
Date:   Tue Jun 13 15:58:48 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB8d3e2af8775e8a778f923583e455f412897fa204

Grease Pencil: Fix problems linking object with Pallete

This should at the very least use a hash system. But it could even do a
local pointer lookup. (Way) More often than not multiple strokes will
point to the same pallete color.

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

M	source/blender/blenloader/intern/readfile.c

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

diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 5fb651490fc..dadb8001b58 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -6496,6 +6496,24 @@ static void lib_link_gpencil(FileData *fd, Main *main)
 {
 	for (bGPdata *gpd = main->gpencil.first; gpd; gpd = gpd->id.next) {
 		if (gpd->id.tag & LIB_TAG_NEED_LINK) {
+			for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
+				for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) {
+					for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
+						gps->palette = newlibadr(fd, NULL, gps->palette);
+						/* Relink color
+						 * The Pallete colors are pointers to a listbase inside the Pallete datablock.
+						 * So the pointers have to be re-assigned on file open
+						 */
+						gps->palcolor = BKE_palette_color_getbyname(gps->palette, gps->colorname);
+						if (gps->palcolor == NULL) {
+							gps->palcolor = BKE_palette_color_add_name(gps->palette, gps->colorname);
+							/* Set to a different color. */
+							ARRAY_SET_ITEMS(gps->palcolor->rgb, 1.0f, 0.0f, 1.0f, 1.0f);
+						}
+					}
+				}
+			}
+
 			IDP_LibLinkProperty(gpd->id.properties, fd);
 			lib_link_animdata(fd, &gpd->id, gpd->adt);
 
@@ -6550,18 +6568,6 @@ static void direct_link_gpencil(FileData *fd, bGPdata *gpd)
 				gps->triangles = NULL;
 				gps->tot_triangles = 0;
 				gps->flag |= GP_STROKE_RECALC_CACHES;
-				/* palette */
-				gps->palette = newlibadr(fd, gpd->id.lib, gps->palette);
-				if (gps->palette == NULL) {
-					gps->palette = BKE_palette_add(G.main, "GP Palette");
-				}
-				/* relink color */
-				gps->palcolor = BKE_palette_color_getbyname(gps->palette, gps->colorname);
-				if (gps->palcolor == NULL) {
-					gps->palcolor = BKE_palette_color_add_name(gps->palette, gps->colorname);
-					/* set to a different color */
-					ARRAY_SET_ITEMS(gps->palcolor->rgb, 1.0f, 0.0f, 1.0f, 1.0f);
-				}
 			}
 		}
 	}
@@ -10012,8 +10018,17 @@ static void expand_linestyle(FileData *fd, Main *mainvar, FreestyleLineStyle *li
 
 static void expand_gpencil(FileData *fd, Main *mainvar, bGPdata *gpd)
 {
-	if (gpd->adt)
+	if (gpd->adt) {
 		expand_animdata(fd, mainvar, gpd->adt);
+	}
+
+	for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
+		for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) {
+			for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
+				expand_doit(fd, mainvar, gps->palette);
+			}
+		}
+	}
 }
 
 static void expand_palette(FileData *fd, Main *mainvar, Palette *palette)




More information about the Bf-blender-cvs mailing list