[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59138] trunk/blender/source/blender: add materials.clear() method, matching other python list method.

Campbell Barton ideasman42 at gmail.com
Wed Aug 14 13:29:58 CEST 2013


Revision: 59138
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59138
Author:   campbellbarton
Date:     2013-08-14 11:29:58 +0000 (Wed, 14 Aug 2013)
Log Message:
-----------
add materials.clear() method, matching other python list method.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_curve.h
    trunk/blender/source/blender/blenkernel/BKE_material.h
    trunk/blender/source/blender/blenkernel/BKE_mesh.h
    trunk/blender/source/blender/blenkernel/intern/curve.c
    trunk/blender/source/blender/blenkernel/intern/material.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/makesrna/intern/rna_ID.c

Modified: trunk/blender/source/blender/blenkernel/BKE_curve.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_curve.h	2013-08-14 11:29:22 UTC (rev 59137)
+++ trunk/blender/source/blender/blenkernel/BKE_curve.h	2013-08-14 11:29:58 UTC (rev 59138)
@@ -69,7 +69,8 @@
 bool BKE_curve_center_median(struct Curve *cu, float cent[3]);
 bool BKE_curve_center_bounds(struct Curve *cu, float cent[3]);
 void BKE_curve_translate(struct Curve *cu, float offset[3], int do_keys);
-void BKE_curve_delete_material_index(struct Curve *cu, int index);
+void BKE_curve_material_index_remove(struct Curve *cu, int index);
+void BKE_curve_material_index_clear(struct Curve *cu);
 
 ListBase *BKE_curve_nurbs_get(struct Curve *cu);
 

Modified: trunk/blender/source/blender/blenkernel/BKE_material.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_material.h	2013-08-14 11:29:22 UTC (rev 59137)
+++ trunk/blender/source/blender/blenkernel/BKE_material.h	2013-08-14 11:29:58 UTC (rev 59138)
@@ -87,9 +87,9 @@
 int object_remove_material_slot(struct Object *ob);
 
 /* rna api */
-void material_append_id(struct ID *id, struct Material *ma);
-struct Material *material_pop_id(struct ID *id, int index, bool remove_material_slot); /* index is an int because of RNA */
-
+void BKE_material_append_id(struct ID *id, struct Material *ma);
+struct Material *BKE_material_pop_id(struct ID *id, int index, bool update_data); /* index is an int because of RNA */
+void BKE_material_clear_id(struct ID *id, bool update_data);
 /* rendering */
 
 void init_render_material(struct Material *, int, float *);

Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h	2013-08-14 11:29:22 UTC (rev 59137)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h	2013-08-14 11:29:58 UTC (rev 59138)
@@ -188,7 +188,8 @@
 void BKE_mesh_from_nurbs(struct Object *ob);
 void BKE_mesh_to_curve_nurblist(struct DerivedMesh *dm, struct ListBase *nurblist, const int edge_users_test);
 void BKE_mesh_to_curve(struct Scene *scene, struct Object *ob);
-void BKE_mesh_delete_material_index(struct Mesh *me, short index);
+void BKE_mesh_material_index_remove(struct Mesh *me, short index);
+void BKE_mesh_material_index_clear(struct Mesh *me);
 void BKE_mesh_smooth_flag_set(struct Object *meshOb, int enableSmooth);
 void BKE_mesh_convert_mfaces_to_mpolys(struct Mesh *mesh);
 void BKE_mesh_do_versions_convert_mfaces_to_mpolys(struct Mesh *mesh);

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c	2013-08-14 11:29:22 UTC (rev 59137)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c	2013-08-14 11:29:58 UTC (rev 59138)
@@ -3819,7 +3819,7 @@
 	}
 }
 
-void BKE_curve_delete_material_index(Curve *cu, int index)
+void BKE_curve_material_index_remove(Curve *cu, int index)
 {
 	const int curvetype = BKE_curve_type_get(cu);
 
@@ -3838,9 +3838,33 @@
 		for (nu = cu->nurb.first; nu; nu = nu->next) {
 			if (nu->mat_nr && nu->mat_nr >= index) {
 				nu->mat_nr--;
-				if (curvetype == OB_CURVE)
+				if (curvetype == OB_CURVE) {
 					nu->charidx--;
+				}
 			}
 		}
 	}
 }
+
+void BKE_curve_material_index_clear(Curve *cu)
+{
+	const int curvetype = BKE_curve_type_get(cu);
+
+	if (curvetype == OB_FONT) {
+		struct CharInfo *info = cu->strinfo;
+		int i;
+		for (i = cu->len - 1; i >= 0; i--, info++) {
+			info->mat_nr = 0;
+		}
+	}
+	else {
+		Nurb *nu;
+
+		for (nu = cu->nurb.first; nu; nu = nu->next) {
+			nu->mat_nr = 0;
+			if (curvetype == OB_CURVE) {
+				nu->charidx = 0;
+			}
+		}
+	}
+}

Modified: trunk/blender/source/blender/blenkernel/intern/material.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/material.c	2013-08-14 11:29:22 UTC (rev 59137)
+++ trunk/blender/source/blender/blenkernel/intern/material.c	2013-08-14 11:29:58 UTC (rev 59138)
@@ -537,17 +537,17 @@
 	return NULL;
 }
 
-static void data_delete_material_index_id(ID *id, short index)
+static void material_data_index_remove_id(ID *id, short index)
 {
 	/* ensure we don't try get materials from non-obdata */
 	BLI_assert(OB_DATA_SUPPORT_ID(GS(id->name)));
 
 	switch (GS(id->name)) {
 		case ID_ME:
-			BKE_mesh_delete_material_index((Mesh *)id, index);
+			BKE_mesh_material_index_remove((Mesh *)id, index);
 			break;
 		case ID_CU:
-			BKE_curve_delete_material_index((Curve *)id, index);
+			BKE_curve_material_index_remove((Curve *)id, index);
 			break;
 		case ID_MB:
 			/* meta-elems don't have materials atm */
@@ -555,8 +555,26 @@
 	}
 }
 
-void material_append_id(ID *id, Material *ma)
+static void material_data_index_clear_id(ID *id)
 {
+	/* ensure we don't try get materials from non-obdata */
+	BLI_assert(OB_DATA_SUPPORT_ID(GS(id->name)));
+
+	switch (GS(id->name)) {
+		case ID_ME:
+			BKE_mesh_material_index_clear((Mesh *)id);
+			break;
+		case ID_CU:
+			BKE_curve_material_index_clear((Curve *)id);
+			break;
+		case ID_MB:
+			/* meta-elems don't have materials atm */
+			break;
+	}
+}
+
+void BKE_material_append_id(ID *id, Material *ma)
+{
 	Material ***matar;
 	if ((matar = give_matarar_id(id))) {
 		short *totcol = give_totcolp_id(id);
@@ -572,7 +590,7 @@
 	}
 }
 
-Material *material_pop_id(ID *id, int index_i, bool remove_material_slot)
+Material *BKE_material_pop_id(ID *id, int index_i, bool update_data)
 {
 	short index = (short)index_i;
 	Material *ret = NULL;
@@ -597,9 +615,9 @@
 				test_object_materials(G.main, id);
 			}
 
-			if (remove_material_slot) {
+			if (update_data) {
 				/* decrease mat_nr index */
-				data_delete_material_index_id(id, index);
+				material_data_index_remove_id(id, index);
 			}
 		}
 	}
@@ -607,6 +625,24 @@
 	return ret;
 }
 
+void BKE_material_clear_id(struct ID *id, bool update_data)
+{
+	Material ***matar;
+	if ((matar = give_matarar_id(id))) {
+		short *totcol = give_totcolp_id(id);
+		*totcol = 0;
+		if (*matar) {
+			MEM_freeN(*matar);
+			*matar = NULL;
+		}
+
+		if (update_data) {
+			/* decrease mat_nr index */
+			material_data_index_clear_id(id);
+		}
+	}
+}
+
 Material *give_current_material(Object *ob, short act)
 {
 	Material ***matarar, *ma;
@@ -1217,7 +1253,7 @@
 
 	/* check indices from mesh */
 	if (ELEM4(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT)) {
-		data_delete_material_index_id((ID *)ob->data, actcol - 1);
+		material_data_index_remove_id((ID *)ob->data, actcol - 1);
 		BKE_displist_free(&ob->disp);
 	}
 
@@ -1693,7 +1729,7 @@
 /* append material */
 static short mesh_addmaterial(Mesh *me, Material *ma)
 {
-	material_append_id(&me->id, NULL);
+	BKE_material_append_id(&me->id, NULL);
 	me->mat[me->totcol - 1] = ma;
 
 	id_us_plus(&ma->id);
@@ -1832,7 +1868,7 @@
 		/* remove material from mesh */
 		for (a = 0; a < me->totcol; ) {
 			if (me->mat[a] == ma) {
-				material_pop_id(&me->id, a, true);
+				BKE_material_pop_id(&me->id, a, true);
 			}
 			else {
 				a++;

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2013-08-14 11:29:22 UTC (rev 59137)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2013-08-14 11:29:58 UTC (rev 59138)
@@ -1852,23 +1852,40 @@
 	}
 }
 
-void BKE_mesh_delete_material_index(Mesh *me, short index)
+void BKE_mesh_material_index_remove(Mesh *me, short index)
 {
+	MPoly *mp;
+	MFace *mf;
 	int i;
 
-	for (i = 0; i < me->totpoly; i++) {
-		MPoly *mp = &((MPoly *) me->mpoly)[i];
-		if (mp->mat_nr && mp->mat_nr >= index)
+	for (mp = me->mpoly, i = 0; i < me->totpoly; i++, mp++) {
+		if (mp->mat_nr && mp->mat_nr >= index) {
 			mp->mat_nr--;
+		}
 	}
-	
-	for (i = 0; i < me->totface; i++) {
-		MFace *mf = &((MFace *) me->mface)[i];
-		if (mf->mat_nr && mf->mat_nr >= index)
+
+	for (mf = me->mface, i = 0; i < me->totface; i++, mf++) {
+		if (mf->mat_nr && mf->mat_nr >= index) {
 			mf->mat_nr--;
+		}
 	}
 }
 
+void BKE_mesh_material_index_clear(Mesh *me)
+{
+	MPoly *mp;
+	MFace *mf;
+	int i;
+
+	for (mp = me->mpoly, i = 0; i < me->totpoly; i++, mp++) {
+		mp->mat_nr = 0;
+	}
+
+	for (mf = me->mface, i = 0; i < me->totface; i++, mf++) {
+		mf->mat_nr = 0;
+	}
+}
+
 void BKE_mesh_smooth_flag_set(Object *meshOb, int enableSmooth) 
 {
 	Mesh *me = meshOb->data;

Modified: trunk/blender/source/blender/makesrna/intern/rna_ID.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_ID.c	2013-08-14 11:29:22 UTC (rev 59137)
+++ trunk/blender/source/blender/makesrna/intern/rna_ID.c	2013-08-14 11:29:58 UTC (rev 59138)
@@ -347,7 +347,7 @@
 
 static void rna_IDMaterials_append_id(ID *id, Material *ma)
 {
-	material_append_id(id, ma);
+	BKE_material_append_id(id, ma);
 
 	WM_main_add_notifier(NC_OBJECT | ND_DRAW, id);
 	WM_main_add_notifier(NC_OBJECT | ND_OB_SHADING, id);
@@ -367,7 +367,7 @@
 		return NULL;
 	}
 
-	ma = material_pop_id(id, index_i, remove_material_slot);
+	ma = BKE_material_pop_id(id, index_i, remove_material_slot);
 
 	if (*totcol == totcol_orig) {
 		BKE_report(reports, RPT_ERROR, "No material to removed");
@@ -381,6 +381,15 @@
 	return ma;
 }
 
+static void rna_IDMaterials_clear_id(ID *id, int remove_material_slot)
+{
+	BKE_material_clear_id(id, remove_material_slot);
+
+	DAG_id_tag_update(id, OB_RECALC_DATA);
+	WM_main_add_notifier(NC_OBJECT | ND_DRAW, id);
+	WM_main_add_notifier(NC_OBJECT | ND_OB_SHADING, id);
+}
+
 static void rna_Library_filepath_set(PointerRNA *ptr, const char *value)
 {
 	Library *lib = (Library *)ptr->data;
@@ -499,6 +508,10 @@
 	RNA_def_boolean(func, "update_data", 0, "", "Update data by re-adjusting the material slots assigned");
 	parm = RNA_def_pointer(func, "material", "Material", "", "Material to remove");
 	RNA_def_function_return(func, parm);
+
+	func = RNA_def_function(srna, "clear", "rna_IDMaterials_clear_id");
+	RNA_def_function_ui_description(func, "Remove all materials from the data block");
+	RNA_def_boolean(func, "update_data", 0, "", "Update data by re-adjusting the material slots assigned");
 }
 
 static void rna_def_ID(BlenderRNA *brna)




More information about the Bf-blender-cvs mailing list