[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36332] trunk/blender/source/blender: fix [#27178] Material links lost when making mesh data local

Campbell Barton ideasman42 at gmail.com
Tue Apr 26 09:17:22 CEST 2011


Revision: 36332
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36332
Author:   campbellbarton
Date:     2011-04-26 07:17:21 +0000 (Tue, 26 Apr 2011)
Log Message:
-----------
fix [#27178] Material links lost when making mesh data local
- making local object data - Curve/Mesh/MBall lost references to linked materials.
- joining a linked mesh object into a local one lost the link.

As well as these reported bugs, checked all local functions for consistency/correctness and found other cases which would also fail.
- making local metaball didn't ensure unique ID name.
- make_local_armature() was missing check for object users - main body of code would never run.
- local particles didn't set the dupli-group or textures to extern.

checked all local functions for consistency/correctness.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_material.h
    trunk/blender/source/blender/blenkernel/BKE_mesh.h
    trunk/blender/source/blender/blenkernel/BKE_object.h
    trunk/blender/source/blender/blenkernel/intern/action.c
    trunk/blender/source/blender/blenkernel/intern/armature.c
    trunk/blender/source/blender/blenkernel/intern/brush.c
    trunk/blender/source/blender/blenkernel/intern/curve.c
    trunk/blender/source/blender/blenkernel/intern/lattice.c
    trunk/blender/source/blender/blenkernel/intern/material.c
    trunk/blender/source/blender/blenkernel/intern/mball.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/blenkernel/intern/texture.c
    trunk/blender/source/blender/blenkernel/intern/world.c
    trunk/blender/source/blender/editors/mesh/meshtools.c

Modified: trunk/blender/source/blender/blenkernel/BKE_material.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_material.h	2011-04-26 00:10:15 UTC (rev 36331)
+++ trunk/blender/source/blender/blenkernel/BKE_material.h	2011-04-26 07:17:21 UTC (rev 36332)
@@ -55,6 +55,7 @@
 struct Material *localize_material(struct Material *ma);
 struct Material *give_node_material(struct Material *ma); /* returns node material or self */
 void make_local_material(struct Material *ma);
+void extern_local_matarar(struct Material **matar, short totcol);
 
 void automatname(struct Material *);
 

Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h	2011-04-26 00:10:15 UTC (rev 36331)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h	2011-04-26 07:17:21 UTC (rev 36332)
@@ -66,7 +66,6 @@
 struct Mesh *add_mesh(const char *name);
 struct Mesh *copy_mesh(struct Mesh *me);
 void mesh_update_customdata_pointers(struct Mesh *me);
-void make_local_tface(struct Mesh *me);
 void make_local_mesh(struct Mesh *me);
 void boundbox_mesh(struct Mesh *me, float *loc, float *size);
 void tex_space_mesh(struct Mesh *me);

Modified: trunk/blender/source/blender/blenkernel/BKE_object.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_object.h	2011-04-26 00:10:15 UTC (rev 36331)
+++ trunk/blender/source/blender/blenkernel/BKE_object.h	2011-04-26 07:17:21 UTC (rev 36332)
@@ -91,7 +91,6 @@
 struct Object *add_object(struct Scene *scene, int type);
 
 struct Object *copy_object(struct Object *ob);
-void expand_local_object(struct Object *ob);
 void make_local_object(struct Object *ob);
 int object_is_libdata(struct Object *ob);
 int object_data_is_libdata(struct Object *ob);

Modified: trunk/blender/source/blender/blenkernel/intern/action.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/action.c	2011-04-26 00:10:15 UTC (rev 36331)
+++ trunk/blender/source/blender/blenkernel/intern/action.c	2011-04-26 07:17:21 UTC (rev 36332)
@@ -95,6 +95,7 @@
 void make_local_action(bAction *act)
 {
 	// Object *ob;
+	Main *bmain= G.main;
 	bAction *actn;
 	int local=0, lib=0;
 	
@@ -102,7 +103,7 @@
 	if (act->id.us==1) {
 		act->id.lib= NULL;
 		act->id.flag= LIB_LOCAL;
-		new_id(NULL, (ID *)act, NULL);
+		new_id(&bmain->action, (ID *)act, NULL);
 		return;
 	}
 	
@@ -121,7 +122,7 @@
 		act->id.lib= NULL;
 		act->id.flag= LIB_LOCAL;
 		//make_local_action_channels(act);
-		new_id(NULL, (ID *)act, NULL);
+		new_id(&bmain->action, (ID *)act, NULL);
 	}
 	else if(local && lib) {
 		actn= copy_action(act);

Modified: trunk/blender/source/blender/blenkernel/intern/armature.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/armature.c	2011-04-26 00:10:15 UTC (rev 36331)
+++ trunk/blender/source/blender/blenkernel/intern/armature.c	2011-04-26 07:17:21 UTC (rev 36332)
@@ -137,39 +137,42 @@
 
 void make_local_armature(bArmature *arm)
 {
+	Main *bmain= G.main;
 	int local=0, lib=0;
 	Object *ob;
-	bArmature *newArm;
-	
-	if (arm->id.lib==NULL)
-		return;
+
+	if (arm->id.lib==NULL) return;
 	if (arm->id.us==1) {
 		arm->id.lib= NULL;
 		arm->id.flag= LIB_LOCAL;
-		new_id(NULL, (ID*)arm, NULL);
+		new_id(&bmain->armature, (ID*)arm, NULL);
 		return;
 	}
-	
+
+	for(ob= bmain->object.first; ob && ELEM(0, lib, local); ob= ob->id.next) {
+		if(ob->data == arm) {
+			if(ob->id.lib) lib= 1;
+			else local= 1;
+		}
+	}
+
 	if(local && lib==0) {
 		arm->id.lib= NULL;
 		arm->id.flag= LIB_LOCAL;
-		new_id(NULL, (ID *)arm, NULL);
+		new_id(&bmain->armature, (ID *)arm, NULL);
 	}
 	else if(local && lib) {
-		newArm= copy_armature(arm);
-		newArm->id.us= 0;
+		bArmature *armn= copy_armature(arm);
+		armn->id.us= 0;
 		
-		ob= G.main->object.first;
-		while(ob) {
-			if(ob->data==arm) {
-				
+		for(ob= bmain->object.first; ob; ob= ob->id.next) {
+			if(ob->data == arm) {
 				if(ob->id.lib==NULL) {
-					ob->data= newArm;
-					newArm->id.us++;
+					ob->data= armn;
+					armn->id.us++;
 					arm->id.us--;
 				}
 			}
-			ob= ob->id.next;
 		}
 	}
 }

Modified: trunk/blender/source/blender/blenkernel/intern/brush.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/brush.c	2011-04-26 00:10:15 UTC (rev 36331)
+++ trunk/blender/source/blender/blenkernel/intern/brush.c	2011-04-26 07:17:21 UTC (rev 36332)
@@ -180,14 +180,20 @@
 	curvemapping_free(brush->curve);
 }
 
+static void extern_local_brush(Brush *brush)
+{
+	id_lib_extern((ID *)brush->mtex.tex);
+}
+
 void make_local_brush(Brush *brush)
 {
+
 	/* - only lib users: do nothing
-		* - only local users: set flag
-		* - mixed: make copy
-		*/
-	
-	Brush *brushn;
+	 * - only local users: set flag
+	 * - mixed: make copy
+	 */
+
+	Main *bmain= G.main;
 	Scene *scene;
 	int local= 0, lib= 0;
 
@@ -197,19 +203,22 @@
 		/* special case: ima always local immediately */
 		brush->clone.image->id.lib= NULL;
 		brush->clone.image->id.flag= LIB_LOCAL;
-		new_id(NULL, (ID *)brush->clone.image, NULL);
+		new_id(&bmain->brush, (ID *)brush->clone.image, NULL);
+		extern_local_brush(brush);
 	}
 
-	for(scene= G.main->scene.first; scene; scene=scene->id.next)
+	for(scene= bmain->scene.first; scene && ELEM(0, lib, local); scene=scene->id.next) {
 		if(paint_brush(&scene->toolsettings->imapaint.paint)==brush) {
 			if(scene->id.lib) lib= 1;
 			else local= 1;
 		}
+	}
 
 	if(local && lib==0) {
 		brush->id.lib= NULL;
 		brush->id.flag= LIB_LOCAL;
-		new_id(NULL, (ID *)brush, NULL);
+		new_id(&bmain->brush, (ID *)brush, NULL);
+		extern_local_brush(brush);
 
 		/* enable fake user by default */
 		if (!(brush->id.flag & LIB_FAKEUSER)) {
@@ -218,17 +227,19 @@
 		}
 	}
 	else if(local && lib) {
-		brushn= copy_brush(brush);
+		Brush *brushn= copy_brush(brush);
 		brushn->id.us= 1; /* only keep fake user */
 		brushn->id.flag |= LIB_FAKEUSER;
 		
-		for(scene= G.main->scene.first; scene; scene=scene->id.next)
-			if(paint_brush(&scene->toolsettings->imapaint.paint)==brush)
+		for(scene= bmain->scene.first; scene; scene=scene->id.next) {
+			if(paint_brush(&scene->toolsettings->imapaint.paint)==brush) {
 				if(scene->id.lib==NULL) {
 					paint_brush_set(&scene->toolsettings->imapaint.paint, brushn);
 					brushn->id.us++;
 					brush->id.us--;
 				}
+			}
+		}
 	}
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c	2011-04-26 00:10:15 UTC (rev 36331)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c	2011-04-26 07:17:21 UTC (rev 36332)
@@ -63,7 +63,8 @@
 #include "BKE_key.h"  
 #include "BKE_library.h"  
 #include "BKE_main.h"  
-#include "BKE_object.h"  
+#include "BKE_object.h"
+#include "BKE_material.h"
 
 
 #include "ED_curve.h"
@@ -216,10 +217,22 @@
 	return cun;
 }
 
+static void extern_local_curve(Curve *cu)
+{	
+	id_lib_extern((ID *)cu->vfont);
+	id_lib_extern((ID *)cu->vfontb);	
+	id_lib_extern((ID *)cu->vfonti);
+	id_lib_extern((ID *)cu->vfontbi);
+	
+	if(cu->mat) {
+		extern_local_matarar(cu->mat, cu->totcol);
+	}
+}
+
 void make_local_curve(Curve *cu)
 {
-	Object *ob = NULL;
-	Curve *cun;
+	Main *bmain= G.main;
+	Object *ob;
 	int local=0, lib=0;
 	
 	/* - when there are only lib users: don't do
@@ -229,47 +242,41 @@
 	
 	if(cu->id.lib==NULL) return;
 
-	if(cu->vfont) cu->vfont->id.lib= NULL;
-	if(cu->vfontb) cu->vfontb->id.lib= NULL;
-	if(cu->vfonti) cu->vfonti->id.lib= NULL;
-	if(cu->vfontbi) cu->vfontbi->id.lib= NULL;
-
 	if(cu->id.us==1) {
 		cu->id.lib= NULL;
 		cu->id.flag= LIB_LOCAL;
-		new_id(NULL, (ID *)cu, NULL);
+
+		new_id(&bmain->curve, (ID *)cu, NULL);
+		extern_local_curve(cu);
 		return;
 	}
-	
-	ob= G.main->object.first;
-	while(ob) {
-		if(ob->data==cu) {
+
+	for(ob= bmain->object.first; ob && ELEM(0, lib, local); ob= ob->id.next) {
+		if(ob->data == cu) {
 			if(ob->id.lib) lib= 1;
 			else local= 1;
 		}
-		ob= ob->id.next;
 	}
-	
+
 	if(local && lib==0) {
 		cu->id.lib= NULL;
 		cu->id.flag= LIB_LOCAL;
-		new_id(NULL, (ID *)cu, NULL);
+
+		new_id(&bmain->curve, (ID *)cu, NULL);
+		extern_local_curve(cu);
 	}
 	else if(local && lib) {
-		cun= copy_curve(cu);
+		Curve *cun= copy_curve(cu);
 		cun->id.us= 0;
-		
-		ob= G.main->object.first;
-		while(ob) {
+
+		for(ob= bmain->object.first; ob; ob= ob->id.next) {
 			if(ob->data==cu) {
-				
 				if(ob->id.lib==NULL) {
 					ob->data= cun;
 					cun->id.us++;
 					cu->id.us--;
 				}
 			}
-			ob= ob->id.next;
 		}
 	}
 }

Modified: trunk/blender/source/blender/blenkernel/intern/lattice.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/lattice.c	2011-04-26 00:10:15 UTC (rev 36331)
+++ trunk/blender/source/blender/blenkernel/intern/lattice.c	2011-04-26 07:17:21 UTC (rev 36332)
@@ -249,8 +249,8 @@
 
 void make_local_lattice(Lattice *lt)
 {
+	Main *bmain= G.main;
 	Object *ob;
-	Lattice *ltn;
 	int local=0, lib=0;
 
 	/* - only lib users: do nothing
@@ -262,39 +262,34 @@
 	if(lt->id.us==1) {
 		lt->id.lib= NULL;
 		lt->id.flag= LIB_LOCAL;
-		new_id(NULL, (ID *)lt, NULL);
+		new_id(&bmain->latt, (ID *)lt, NULL);
 		return;
 	}
 	
-	ob= G.main->object.first;
-	while(ob) {
+	for(ob= bmain->object.first; ob && ELEM(0, lib, local); ob= ob->id.next) {
 		if(ob->data==lt) {
 			if(ob->id.lib) lib= 1;
 			else local= 1;
 		}
-		ob= ob->id.next;
 	}
 	
 	if(local && lib==0) {
 		lt->id.lib= NULL;
 		lt->id.flag= LIB_LOCAL;
-		new_id(NULL, (ID *)lt, NULL);
+		new_id(&bmain->latt, (ID *)lt, NULL);
 	}
 	else if(local && lib) {
-		ltn= copy_lattice(lt);
+		Lattice *ltn= copy_lattice(lt);
 		ltn->id.us= 0;
-		
-		ob= G.main->object.first;
-		while(ob) {
+
+		for(ob= bmain->object.first; ob; ob= ob->id.next) {
 			if(ob->data==lt) {
-				
 				if(ob->id.lib==NULL) {
 					ob->data= ltn;
 					ltn->id.us++;
 					lt->id.us--;
 				}
 			}
-			ob= ob->id.next;
 		}
 	}
 }

Modified: trunk/blender/source/blender/blenkernel/intern/material.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/material.c	2011-04-26 00:10:15 UTC (rev 36331)
+++ trunk/blender/source/blender/blenkernel/intern/material.c	2011-04-26 07:17:21 UTC (rev 36332)

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list