[Bf-blender-cvs] [5c4fd526124] blender2.8: Fix T56220: Adding Grease Object crashes if link Material is set to Object

Antonioya noreply at git.blender.org
Wed Aug 8 17:17:32 CEST 2018


Commit: 5c4fd526124c348c8f324a2d0a384958c6e793b8
Author: Antonioya
Date:   Wed Aug 8 16:56:56 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB5c4fd526124c348c8f324a2d0a384958c6e793b8

Fix T56220: Adding Grease Object crashes if link Material is set to Object

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

M	release/scripts/startup/bl_ui/space_view3d.py
M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/blenkernel/intern/gpencil.c
M	source/blender/editors/gpencil/gpencil_add_monkey.c
M	source/blender/editors/gpencil/gpencil_add_stroke.c
M	source/blender/editors/gpencil/gpencil_brush.c
M	source/blender/editors/gpencil/gpencil_data.c
M	source/blender/editors/gpencil/gpencil_edit.c
M	source/blender/editors/gpencil/gpencil_fill.c
M	source/blender/editors/gpencil/gpencil_paint.c
M	source/blender/editors/gpencil/gpencil_primitive.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c

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

diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 349832cedf2..72296861ad9 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -3545,9 +3545,10 @@ class VIEW3D_MT_assign_material(Menu):
 
     def draw(self, context):
         layout = self.layout
-        ob = context.active_object;
+        ob = context.active_object
 
-        for mat in ob.data.materials:
+        for slot in ob.material_slots:
+            mat = slot.material
             layout.operator("gpencil.stroke_change_color", text=mat.name).material = mat.name
 
 
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 887a7f4f67b..532eaf9a0e7 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -94,6 +94,7 @@ void BKE_gpencil_frame_delete_laststroke(struct bGPDlayer *gpl, struct bGPDframe
 /* materials */
 void BKE_gpencil_material_index_remove(struct bGPdata *gpd, int index);
 void BKE_gpencil_material_remap(struct bGPdata *gpd, const unsigned int *remap, unsigned int remap_len);
+int BKE_gpencil_get_material_index(struct Object *ob, struct Material *ma);
 
 /* statistics functions */
 void BKE_gpencil_stats_update(struct bGPdata *gpd);
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index b619304d39b..140e4a25882 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -1630,3 +1630,18 @@ void BKE_gpencil_stats_update(bGPdata *gpd)
 	}
 
 }
+
+/* get material index */
+int BKE_gpencil_get_material_index(Object *ob, Material *ma)
+{
+	short *totcol = give_totcolp(ob);
+	Material *read_ma = NULL;
+	for (short i = 0; i < *totcol; i++) {
+		read_ma = give_current_material(ob, i + 1);
+		if (ma == read_ma) {
+			return i + 1;
+		}
+	}
+
+	return 0;
+}
diff --git a/source/blender/editors/gpencil/gpencil_add_monkey.c b/source/blender/editors/gpencil/gpencil_add_monkey.c
index b0c3675c123..78286e3f672 100644
--- a/source/blender/editors/gpencil/gpencil_add_monkey.c
+++ b/source/blender/editors/gpencil/gpencil_add_monkey.c
@@ -55,11 +55,10 @@ typedef struct ColorTemplate {
 /* Add color an ensure duplications (matched by name) */
 static int gpencil_monkey_color(Main *bmain, Object *ob, const ColorTemplate *pct)
 {
-	Material *ma = NULL;
-	Material ***matar = give_matarar(ob);
 	short *totcol = give_totcolp(ob);
+	Material *ma = NULL;
 	for (short i = 0; i < *totcol; i++) {
-		ma = (*matar)[i];
+		ma = give_current_material(ob, i + 1);
 		if (STREQ(ma->id.name, pct->name)) {
 			return i;
 		}
@@ -73,7 +72,7 @@ static int gpencil_monkey_color(Main *bmain, Object *ob, const ColorTemplate *pc
 	copy_v4_v4(ma->gp_style->stroke_rgba, pct->line);
 	copy_v4_v4(ma->gp_style->fill_rgba, pct->fill);
 
-	return BKE_object_material_slot_find_index(ob, ma) - 1;
+	return BKE_gpencil_get_material_index(ob, ma) - 1;
 }
 
 /* ***************************************************************** */
diff --git a/source/blender/editors/gpencil/gpencil_add_stroke.c b/source/blender/editors/gpencil/gpencil_add_stroke.c
index f932f98ac1d..c5020593bcb 100644
--- a/source/blender/editors/gpencil/gpencil_add_stroke.c
+++ b/source/blender/editors/gpencil/gpencil_add_stroke.c
@@ -55,11 +55,10 @@ typedef struct ColorTemplate {
 /* Add color an ensure duplications (matched by name) */
 static int gp_stroke_material(Main *bmain, Object *ob, const ColorTemplate *pct)
 {
-	Material *ma = NULL;
-	Material ***matar = give_matarar(ob);
 	short *totcol = give_totcolp(ob);
+	Material *ma = NULL;
 	for (short i = 0; i < *totcol; i++) {
-		ma = (*matar)[i];
+		ma = give_current_material(ob, i + 1);
 		if (STREQ(ma->id.name, pct->name)) {
 			return i;
 		}
@@ -73,7 +72,7 @@ static int gp_stroke_material(Main *bmain, Object *ob, const ColorTemplate *pct)
 	copy_v4_v4(ma->gp_style->stroke_rgba, pct->line);
 	copy_v4_v4(ma->gp_style->fill_rgba, pct->fill);
 
-	return BKE_object_material_slot_find_index(ob, ma) - 1;
+	return BKE_gpencil_get_material_index(ob, ma) - 1;
 }
 
 /* ***************************************************************** */
diff --git a/source/blender/editors/gpencil/gpencil_brush.c b/source/blender/editors/gpencil/gpencil_brush.c
index ff93e7fc57d..d8be0dd665a 100644
--- a/source/blender/editors/gpencil/gpencil_brush.c
+++ b/source/blender/editors/gpencil/gpencil_brush.c
@@ -1053,8 +1053,8 @@ static void gp_brush_clone_add(bContext *C, tGP_BrushEditData *gso)
 
 			/* Fix color references */
 			Material *ma = BLI_ghash_lookup(data->new_colors, &new_stroke->mat_nr);
-			if ((ma) && (BKE_object_material_slot_find_index(ob, ma) > 0)) {
-				gps->mat_nr = BKE_object_material_slot_find_index(ob, ma) - 1;
+			if ((ma) && (BKE_gpencil_get_material_index(ob, ma) > 0)) {
+				gps->mat_nr = BKE_gpencil_get_material_index(ob, ma) - 1;
 				CLAMP_MIN(gps->mat_nr, 0);
 			}
 			else {
diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c
index 43721d73a80..faeee4db169 100644
--- a/source/blender/editors/gpencil/gpencil_data.c
+++ b/source/blender/editors/gpencil/gpencil_data.c
@@ -1150,8 +1150,8 @@ static int gp_stroke_change_color_exec(bContext *C, wmOperator *op)
 		}
 	}
 	/* try to find slot */
-	int idx = BKE_object_material_slot_find_index(ob, ma) - 1;
-	if (idx == 0) {
+	int idx = BKE_gpencil_get_material_index(ob, ma) - 1;
+	if (idx <= 0) {
 		return OPERATOR_CANCELLED;
 	}
 
@@ -1230,7 +1230,6 @@ static int gp_stroke_lock_color_exec(bContext *C, wmOperator *UNUSED(op))
 
 	Object *ob = CTX_data_active_object(C);
 
-	Material ***matar = give_matarar(ob);
 	short *totcol = give_totcolp(ob);
 
 	/* sanity checks */
@@ -1239,9 +1238,8 @@ static int gp_stroke_lock_color_exec(bContext *C, wmOperator *UNUSED(op))
 
 	/* first lock all colors */
 	for (short i = 0; i < *totcol; i++) {
-		Material *tmp_ma = (*matar)[i];
+		Material *tmp_ma = give_current_material(ob, i + 1);
 		tmp_ma->gp_style->flag |= GP_STYLE_COLOR_LOCKED;
-
 	}
 
 	/* loop all selected strokes and unlock any color */
@@ -1256,7 +1254,8 @@ static int gp_stroke_lock_color_exec(bContext *C, wmOperator *UNUSED(op))
 						continue;
 					}
 					/* unlock color */
-					Material *tmp_ma = (*matar)[gps->mat_nr];
+					Material *tmp_ma = give_current_material(ob, gps->mat_nr + 1);
+
 					tmp_ma->gp_style->flag &= ~GP_STYLE_COLOR_LOCKED;
 				}
 			}
@@ -1896,12 +1895,11 @@ int ED_gpencil_join_objects_exec(bContext *C, wmOperator *op)
 					obact->actdef = 1;
 
 				/* add missing materials reading source materials and checking in destination object */
-				Material ***matar = give_matarar(ob_src);
 				short *totcol = give_totcolp(ob_src);
 
 				for (short i = 0; i < *totcol; i++) {
-					Material *tmp_ma = (*matar)[i];
-					if (BKE_object_material_slot_find_index(ob_dst, tmp_ma) == 0) {
+					Material *tmp_ma = give_current_material(ob_src, i + 1);
+					if (BKE_gpencil_get_material_index(ob_dst, tmp_ma) == 0) {
 						BKE_object_material_slot_add(bmain, ob_dst);
 						assign_material(bmain, ob_dst, tmp_ma, ob_dst->totcol, BKE_MAT_ASSIGN_USERPREF);
 					}
@@ -1941,7 +1939,7 @@ int ED_gpencil_join_objects_exec(bContext *C, wmOperator *op)
 							/* reasign material. Look old material and try to find in dst */
 							ma_src = give_current_material(ob_src, gps->mat_nr + 1);
 							if (ma_src != NULL) {
-								idx = BKE_object_material_slot_find_index(ob_dst, ma_src);
+								idx = BKE_gpencil_get_material_index(ob_dst, ma_src);
 								if (idx > 0) {
 									gps->mat_nr = idx - 1;
 								}
@@ -2041,13 +2039,12 @@ static int gpencil_lock_layer_exec(bContext *C, wmOperator *UNUSED(op))
 
 	/* first lock and hide all colors */
 	Material *ma = NULL;
-	Material ***matar = give_matarar(ob);
 	short *totcol = give_totcolp(ob);
-	if ((totcol == 0) || (matar == NULL))
+	if (totcol == 0)
 		return OPERATOR_CANCELLED;
 
 	for (short i = 0; i < *totcol; i++) {
-		ma = (*matar)[i];
+		ma = give_current_material(ob, i + 1);
 		gp_style = ma->gp_style;
 		gp_style->flag |= GP_STYLE_COLOR_LOCKED;
 		gp_style->flag |= GP_STYLE_COLOR_HIDE;
@@ -2113,10 +2110,9 @@ static int gpencil_color_isolate_exec(bContext *C, wmOperator *op)
 
 	/* Test whether to isolate or clear all flags */
 	Material *ma = NULL;
-	Material ***matar = give_matarar(ob);
 	short *totcol = give_totcolp(ob);
 	for (short i = 0; i < *totcol; i++) {
-		ma = (*matar)[i];
+		ma = give_current_material(ob, i + 1);
 		/* Skip if this is the active one */
 		if (ma == active_ma)
 			continue;
@@ -2135,7 +2131,7 @@ static int gpencil_color_isolate_exec(bContext *C, wmOperator *op)
 	if (isolate) {
 		/* Set flags on all "other" colors */
 		for (short i = 0; i < *totcol; i++) {
-			ma = (*matar)[i];
+			ma = give_current_material(ob, i + 1);
 			gp_style = ma->gp_style;
 			if (gp_style == active_color)
 				continue;
@@ -2146,7 +2142,7 @@ static int gpencil_color_isolate_exec(bContext *C, wmOperator *op)
 	else {
 		/* Clear flags - Restore everything else */
 		for (short i = 0; i < *totcol; i++) {
-			ma = (*matar)[i];
+			ma = give_current_material(ob, i + 1);
 			gp_style = ma->gp_style;
 			gp_style->flag &= ~flags;
 		}
@@ -2188,16 +2184,15 @@ static int gpencil_color_hide_exec(bContext *C, wmOperator *op)
 	bool unselected = RNA_boolean_get(op->ptr, "unselected");
 
 	Material *ma = NULL;
-	Material ***matar = give_matarar(ob);
 	short *totcol = give_totcolp(ob);
-	if ((totcol == 0) || (matar == NULL))
+	if (totcol == 0)
 		return OPERATOR_CANCELLED;
 
 	if (unselected) {
 		/* hide unselected */
 		MaterialGPencilStyle *color = NULL;
 		for (short i = 0; i < *totcol; i++) {
-			ma = (*matar)[i];
+			ma = give_current_material(ob, i + 1);
 			color = ma->gp_style;
 			if (active_color != color) {
 				color->flag |= GP_STYLE_COLOR_HIDE;
@@ -2239,17 +2234,16 @@ static int gpencil_color_reveal_exec(bContext *C, wmOperator *UNUSED(op))
 {
 	Object *ob = CTX_data_active_object(C);
 	Material *ma = NULL;
-	Material ***matar = give_matarar(ob);
 	short *totcol = give_totcolp(ob);
 
-	if ((totcol == 0) || (matar == NULL))
+	if (to

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list