[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38879] trunk/blender/source/blender: bugfix [#28111] material.pop breaks mt->mat_nr

Dalai Felinto dfelinto at gmail.com
Sun Jul 31 13:12:38 CEST 2011


Revision: 38879
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38879
Author:   dfelinto
Date:     2011-07-31 11:12:38 +0000 (Sun, 31 Jul 2011)
Log Message:
-----------
bugfix [#28111] material.pop breaks mt->mat_nr

create a new parameter for materials.pop() to not remove material slot.
this way the mat_nr is still the old one.

for the default behaviour we now have material remapping (i.e. data_delete_material_index_id(id, index)).
This new function is brought from the material_slot remove function.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_material.h
    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_material.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_material.h	2011-07-31 10:54:51 UTC (rev 38878)
+++ trunk/blender/source/blender/blenkernel/BKE_material.h	2011-07-31 11:12:38 UTC (rev 38879)
@@ -78,7 +78,7 @@
 
 /* rna api */
 void material_append_id(struct ID *id, struct Material *ma);
-struct Material *material_pop_id(struct ID *id, int index);
+struct Material *material_pop_id(struct ID *id, int index, int remove_material_slot);
 
 /* rendering */
 

Modified: trunk/blender/source/blender/blenkernel/intern/material.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/material.c	2011-07-31 10:54:51 UTC (rev 38878)
+++ trunk/blender/source/blender/blenkernel/intern/material.c	2011-07-31 11:12:38 UTC (rev 38879)
@@ -61,8 +61,8 @@
 #include "BKE_material.h"
 #include "BKE_mesh.h"
 #include "BKE_node.h"
+#include "BKE_curve.h"
 
-
 #include "GPU_material.h"
 
 /* used in UI and render */
@@ -515,6 +515,37 @@
 	return NULL;
 }
 
+void data_delete_material_index_id(ID *id, int index)
+{
+	Mesh *me;
+	Curve *cu;
+	Nurb *nu;
+	int curvetype;
+
+	switch(GS(id->name)) {
+	case ID_ME:
+		me=(Mesh *)id;
+		mesh_delete_material_index(me, index);
+		break;
+	case ID_CU:
+		cu= (Curve *)id;
+		nu= cu->nurb.first;
+
+		curvetype=curve_type(cu);
+		if (!ELEM(curvetype, OB_CURVE, OB_SURF))
+			return;
+		
+		while (nu) {
+			if(nu->mat_nr && nu->mat_nr>=index) {
+				nu->mat_nr--;
+				if (curvetype == OB_CURVE) nu->charidx--;
+			}
+			nu= nu->next;
+		}
+		break;
+	}
+}
+
 void material_append_id(ID *id, Material *ma)
 {
 	Material ***matar;
@@ -532,7 +563,7 @@
 	}
 }
 
-Material *material_pop_id(ID *id, int index)
+Material *material_pop_id(ID *id, int index, int remove_material_slot)
 {
 	Material *ret= NULL;
 	Material ***matar;
@@ -540,27 +571,36 @@
 		short *totcol= give_totcolp_id(id);
 		if(index >= 0 && index < (*totcol)) {
 			ret= (*matar)[index];
-			id_us_min((ID *)ret);			
-			if(*totcol <= 1) {
-				*totcol= 0;
-				MEM_freeN(*matar);
-				*matar= NULL;
-			}
-			else {
-				Material **mat;
+			id_us_min((ID *)ret);
 
-				if(index + 1 != (*totcol))
-					memmove((*matar)+index, (*matar)+(index+1), sizeof(void *) * ((*totcol) - (index + 1)));
+			if (remove_material_slot) {
+				if(*totcol <= 1) {
+					*totcol= 0;
+					MEM_freeN(*matar);
+					*matar= NULL;
+				}
+				else {
+					Material **mat;
+					if(index + 1 != (*totcol))
+						memmove((*matar)+index, (*matar)+(index+1), sizeof(void *) * ((*totcol) - (index + 1)));
 
-				(*totcol)--;
-				
-				mat= MEM_callocN(sizeof(void *) * (*totcol), "newmatar");
-				memcpy(mat, *matar, sizeof(void *) * (*totcol));
-				MEM_freeN(*matar);
+					(*totcol)--;
+					
+					mat= MEM_callocN(sizeof(void *) * (*totcol), "newmatar");
+					memcpy(mat, *matar, sizeof(void *) * (*totcol));
+					MEM_freeN(*matar);
 
-				*matar= mat;
-				test_object_materials(id);
+					*matar= mat;
+					test_object_materials(id);
+				}
+
+				/* decrease mat_nr index */
+				data_delete_material_index_id(id, index);
 			}
+
+			/* don't remove material slot, only clear it*/
+			else
+				(*matar)[index]= NULL;
 		}
 	}
 	
@@ -1025,8 +1065,6 @@
 {
 	Material *mao, ***matarar;
 	Object *obt;
-	Curve *cu;
-	Nurb *nu;
 	short *totcolp;
 	int a, actcol;
 	
@@ -1086,25 +1124,10 @@
 	}
 
 	/* check indices from mesh */
-
-	if(ob->type==OB_MESH) {
-		Mesh *me= get_mesh(ob);
-		mesh_delete_material_index(me, actcol-1);
+	if (ELEM3(ob->type, OB_MESH, OB_CURVE, OB_SURF)) {
+		data_delete_material_index_id(&ob->id, actcol-1);
 		freedisplist(&ob->disp);
 	}
-	else if ELEM(ob->type, OB_CURVE, OB_SURF) {
-		cu= ob->data;
-		nu= cu->nurb.first;
-		
-		while(nu) {
-			if(nu->mat_nr && nu->mat_nr>=actcol-1) {
-				nu->mat_nr--;
-				if (ob->type == OB_CURVE) nu->charidx--;
-			}
-			nu= nu->next;
-		}
-		freedisplist(&ob->disp);
-	}
 
 	return TRUE;
 }

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2011-07-31 10:54:51 UTC (rev 38878)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2011-07-31 11:12:38 UTC (rev 38879)
@@ -1254,10 +1254,10 @@
 
 void mesh_delete_material_index(Mesh *me, int index)
 {
+	MFace *mf;
 	int i;
 
-	for (i=0; i<me->totface; i++) {
-		MFace *mf = &((MFace*) me->mface)[i];
+	for (i=0, mf=me->mface; i<me->totface; i++, mf++) {
 		if (mf->mat_nr && mf->mat_nr>=index) 
 			mf->mat_nr--;
 	}

Modified: trunk/blender/source/blender/makesrna/intern/rna_ID.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_ID.c	2011-07-31 10:54:51 UTC (rev 38878)
+++ trunk/blender/source/blender/makesrna/intern/rna_ID.c	2011-07-31 11:12:38 UTC (rev 38879)
@@ -418,6 +418,7 @@
 	RNA_def_function_ui_description(func, "Remove a material from the data block.");
 	parm= RNA_def_int(func, "index", 0, 0, INT_MAX, "", "Index of material to remove.", 0, INT_MAX);
 	RNA_def_property_flag(parm, PROP_REQUIRED);
+	RNA_def_boolean(func, "remove_material_slot", 1, "", "Remove the material slot and assign 1st material to old faces.");
 	parm= RNA_def_pointer(func, "material", "Material", "", "Material to remove.");
 	RNA_def_function_return(func, parm);
 }




More information about the Bf-blender-cvs mailing list