[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33495] trunk/blender/source/blender: bugfix [#22663] object material slots not updated for library data

Campbell Barton ideasman42 at gmail.com
Mon Dec 6 03:32:20 CET 2010


Revision: 33495
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33495
Author:   campbellbarton
Date:     2010-12-06 03:32:16 +0100 (Mon, 06 Dec 2010)

Log Message:
-----------
bugfix [#22663] object material slots not updated for library data

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_material.h
    trunk/blender/source/blender/blenkernel/intern/material.c
    trunk/blender/source/blender/blenloader/intern/readfile.c

Modified: trunk/blender/source/blender/blenkernel/BKE_material.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_material.h	2010-12-06 01:23:18 UTC (rev 33494)
+++ trunk/blender/source/blender/blenkernel/BKE_material.h	2010-12-06 02:32:16 UTC (rev 33495)
@@ -45,6 +45,7 @@
 void init_def_material(void);
 void free_material(struct Material *sc); 
 void test_object_materials(struct ID *id);
+void resize_object_material(struct Object *ob, const short totcol);
 void init_material(struct Material *ma);
 struct Material *add_material(const char *name);
 struct Material *copy_material(struct Material *ma);

Modified: trunk/blender/source/blender/blenkernel/intern/material.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/material.c	2010-12-06 01:23:18 UTC (rev 33494)
+++ trunk/blender/source/blender/blenkernel/intern/material.c	2010-12-06 02:32:16 UTC (rev 33495)
@@ -590,67 +590,53 @@
 /* from misc_util: flip the bytes from x  */
 /*  #define GS(x) (((unsigned char *)(x))[0] << 8 | ((unsigned char *)(x))[1]) */
 
-void test_object_materials(ID *id)
+void resize_object_material(Object *ob, const short totcol)
 {
-	/* make the ob mat-array same size as 'ob->data' mat-array */
-	Object *ob;
-	Mesh *me;
-	Curve *cu;
-	MetaBall *mb;
 	Material **newmatar;
 	char *newmatbits;
-	int totcol=0;
 
-	if(id==0) return;
-
-	if( GS(id->name)==ID_ME ) {
-		me= (Mesh *)id;
-		totcol= me->totcol;
+	if(totcol==0) {
+		if(ob->totcol) {
+			MEM_freeN(ob->mat);
+			MEM_freeN(ob->matbits);
+			ob->mat= NULL;
+			ob->matbits= NULL;
+		}
 	}
-	else if( GS(id->name)==ID_CU ) {
-		cu= (Curve *)id;
-		totcol= cu->totcol;
+	else if(ob->totcol<totcol) {
+		newmatar= MEM_callocN(sizeof(void *)*totcol, "newmatar");
+		newmatbits= MEM_callocN(sizeof(char)*totcol, "newmatbits");
+		if(ob->totcol) {
+			memcpy(newmatar, ob->mat, sizeof(void *)*ob->totcol);
+			memcpy(newmatbits, ob->matbits, sizeof(char)*ob->totcol);
+			MEM_freeN(ob->mat);
+			MEM_freeN(ob->matbits);
+		}
+		ob->mat= newmatar;
+		ob->matbits= newmatbits;
 	}
-	else if( GS(id->name)==ID_MB ) {
-		mb= (MetaBall *)id;
-		totcol= mb->totcol;
+	ob->totcol= totcol;
+	if(ob->totcol && ob->actcol==0) ob->actcol= 1;
+	if(ob->actcol>ob->totcol) ob->actcol= ob->totcol;
+}
+
+void test_object_materials(ID *id)
+{
+	/* make the ob mat-array same size as 'ob->data' mat-array */
+	Object *ob;
+	short *totcol;
+
+	if(id || (totcol=give_totcolp_id(id))==NULL) {
+		return;
 	}
-	else return;
 
-	ob= G.main->object.first;
-	while(ob) {
-		
+	for(ob= G.main->object.first; ob; ob= ob->id.next) {
 		if(ob->data==id) {
-		
-			if(totcol==0) {
-				if(ob->totcol) {
-					MEM_freeN(ob->mat);
-					MEM_freeN(ob->matbits);
-					ob->mat= NULL;
-					ob->matbits= NULL;
-				}
-			}
-			else if(ob->totcol<totcol) {
-				newmatar= MEM_callocN(sizeof(void *)*totcol, "newmatar");
-				newmatbits= MEM_callocN(sizeof(char)*totcol, "newmatbits");
-				if(ob->totcol) {
-					memcpy(newmatar, ob->mat, sizeof(void *)*ob->totcol);
-					memcpy(newmatbits, ob->matbits, sizeof(char)*ob->totcol);
-					MEM_freeN(ob->mat);
-					MEM_freeN(ob->matbits);
-				}
-				ob->mat= newmatar;
-				ob->matbits= newmatbits;
-			}
-			ob->totcol= totcol;
-			if(ob->totcol && ob->actcol==0) ob->actcol= 1;
-			if(ob->actcol>ob->totcol) ob->actcol= ob->totcol;
+			resize_object_material(ob, *totcol);
 		}
-		ob= ob->id.next;
 	}
 }
 
-
 void assign_material(Object *ob, Material *ma, int act)
 {
 	Material *mao, **matar, ***matarar;

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2010-12-06 01:23:18 UTC (rev 33494)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2010-12-06 02:32:16 UTC (rev 33495)
@@ -106,6 +106,7 @@
 #include "BKE_lattice.h"
 #include "BKE_library.h" // for which_libbase
 #include "BKE_idcode.h"
+#include "BKE_material.h"
 #include "BKE_main.h" // for Main
 #include "BKE_mesh.h" // for ME_ defines (patching)
 #include "BKE_modifier.h"
@@ -3507,7 +3508,7 @@
 			
 			poin= ob->data;
 			ob->data= newlibadr_us(fd, ob->id.lib, ob->data);
-			   
+
 			if(ob->data==NULL && poin!=NULL) {
 				if(ob->id.lib)
 					printf("Can't find obdata of %s lib %s\n", ob->id.name+2, ob->id.lib->name);
@@ -3525,6 +3526,17 @@
 			}
 			for(a=0; a<ob->totcol; a++) ob->mat[a]= newlibadr_us(fd, ob->id.lib, ob->mat[a]);
 			
+			/* When the object is local and the data is library its possible
+			 * the material list size gets out of sync. [#22663] */
+			if(ob->data && ob->id.lib != ((ID *)ob->data)->lib) {
+				short *totcol_data= give_totcolp(ob);
+				/* Only expand so as not to loose any object materials that might be set. */
+				if(totcol_data && *totcol_data > ob->totcol) {
+					/* printf("'%s' %d -> %d\n", ob->id.name, ob->totcol, *totcol_data); */
+					resize_object_material(ob, *totcol_data);
+				}
+			}
+
 			ob->gpd= newlibadr_us(fd, ob->id.lib, ob->gpd);
 			ob->duplilist= NULL;
             





More information about the Bf-blender-cvs mailing list