[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42278] trunk/blender/source/blender: fix [#29459] Crash making a linked object group local

Campbell Barton ideasman42 at gmail.com
Wed Nov 30 01:32:22 CET 2011


Revision: 42278
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42278
Author:   campbellbarton
Date:     2011-11-30 00:32:13 +0000 (Wed, 30 Nov 2011)
Log Message:
-----------
fix [#29459] Crash making a linked object group local

was an error with make-local refactor & path updating.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_library.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/camera.c
    trunk/blender/source/blender/blenkernel/intern/curve.c
    trunk/blender/source/blender/blenkernel/intern/image.c
    trunk/blender/source/blender/blenkernel/intern/lamp.c
    trunk/blender/source/blender/blenkernel/intern/lattice.c
    trunk/blender/source/blender/blenkernel/intern/library.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/speaker.c
    trunk/blender/source/blender/blenkernel/intern/texture.c
    trunk/blender/source/blender/blenkernel/intern/world.c
    trunk/blender/source/blender/editors/space_outliner/outliner_tools.c

Modified: trunk/blender/source/blender/blenkernel/BKE_library.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_library.h	2011-11-29 23:00:10 UTC (rev 42277)
+++ trunk/blender/source/blender/blenkernel/BKE_library.h	2011-11-30 00:32:13 UTC (rev 42278)
@@ -49,7 +49,7 @@
 void *copy_libblock(struct ID *id);
 void copy_libblock_data(struct ID *id, const struct ID *id_from, const short do_action);
 
-void BKE_id_lib_local_paths(struct Main *bmain, struct ID *id);
+void BKE_id_lib_local_paths(struct Main *bmain, struct Library *lib, struct ID *id);
 void id_lib_extern(struct ID *id);
 void BKE_library_filepath_set(struct Library *lib, const char *filepath);
 void id_us_plus(struct ID *id);

Modified: trunk/blender/source/blender/blenkernel/intern/action.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/action.c	2011-11-29 23:00:10 UTC (rev 42277)
+++ trunk/blender/source/blender/blenkernel/intern/action.c	2011-11-30 00:32:13 UTC (rev 42278)
@@ -92,8 +92,8 @@
 
 /* temp data for make_local_action */
 typedef struct tMakeLocalActionContext {
-	bAction *act;    /* original action */
-	bAction *actn;   /* new action */
+	bAction *act;       /* original action */
+	bAction *act_new;   /* new action */
 	
 	int is_lib;         /* some action users were libraries */
 	int is_local;       /* some action users were not libraries */
@@ -117,9 +117,9 @@
 	
 	if (adt->action == mlac->act) {
 		if (id->lib == NULL) {
-			adt->action = mlac->actn;
+			adt->action = mlac->act_new;
 			
-			id_us_plus(&mlac->actn->id);
+			id_us_plus(&mlac->act_new->id);
 			id_us_min(&mlac->act->id);
 		}
 	}
@@ -146,10 +146,10 @@
 		id_clear_lib_data(bmain, &act->id);
 	}
 	else if (mlac.is_local && mlac.is_lib) {
-		mlac.actn= copy_action(act);
-		mlac.actn->id.us= 0;
+		mlac.act_new= copy_action(act);
+		mlac.act_new->id.us= 0;
 
-		BKE_id_lib_local_paths(bmain, &mlac.actn->id);
+		BKE_id_lib_local_paths(bmain, act->id.lib, &mlac.act_new->id);
 
 		BKE_animdata_main_cb(bmain, make_localact_apply_cb, &mlac);
 	}

Modified: trunk/blender/source/blender/blenkernel/intern/armature.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/armature.c	2011-11-29 23:00:10 UTC (rev 42277)
+++ trunk/blender/source/blender/blenkernel/intern/armature.c	2011-11-30 00:32:13 UTC (rev 42278)
@@ -158,17 +158,17 @@
 		id_clear_lib_data(bmain, &arm->id);
 	}
 	else if(is_local && is_lib) {
-		bArmature *armn= copy_armature(arm);
-		armn->id.us= 0;
+		bArmature *arm_new= copy_armature(arm);
+		arm_new->id.us= 0;
 
 		/* Remap paths of new ID using old library as base. */
-		BKE_id_lib_local_paths(bmain, &armn->id);
+		BKE_id_lib_local_paths(bmain, arm->id.lib, &arm_new->id);
 
 		for(ob= bmain->object.first; ob; ob= ob->id.next) {
 			if(ob->data == arm) {
 				if(ob->id.lib==NULL) {
-					ob->data= armn;
-					armn->id.us++;
+					ob->data= arm_new;
+					arm_new->id.us++;
 					arm->id.us--;
 				}
 			}

Modified: trunk/blender/source/blender/blenkernel/intern/brush.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/brush.c	2011-11-29 23:00:10 UTC (rev 42277)
+++ trunk/blender/source/blender/blenkernel/intern/brush.c	2011-11-30 00:32:13 UTC (rev 42278)
@@ -224,17 +224,17 @@
 		}
 	}
 	else if(is_local && is_lib) {
-		Brush *brushn= copy_brush(brush);
-		brushn->id.us= 1; /* only keep fake user */
-		brushn->id.flag |= LIB_FAKEUSER;
+		Brush *brush_new= copy_brush(brush);
+		brush_new->id.us= 1; /* only keep fake user */
+		brush_new->id.flag |= LIB_FAKEUSER;
 
 		/* Remap paths of new ID using old library as base. */
-		BKE_id_lib_local_paths(bmain, &brush->id);
+		BKE_id_lib_local_paths(bmain, brush->id.lib, &brush_new->id);
 		
 		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);
+					paint_brush_set(&scene->toolsettings->imapaint.paint, brush_new);
 				}
 			}
 		}

Modified: trunk/blender/source/blender/blenkernel/intern/camera.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/camera.c	2011-11-29 23:00:10 UTC (rev 42277)
+++ trunk/blender/source/blender/blenkernel/intern/camera.c	2011-11-30 00:32:13 UTC (rev 42278)
@@ -108,18 +108,18 @@
 		id_clear_lib_data(bmain, &cam->id);
 	}
 	else if(is_local && is_lib) {
-		Camera *camn= copy_camera(cam);
+		Camera *cam_new= copy_camera(cam);
 
-		camn->id.us= 0;
+		cam_new->id.us= 0;
 
 		/* Remap paths of new ID using old library as base. */
-		BKE_id_lib_local_paths(bmain, &camn->id);
+		BKE_id_lib_local_paths(bmain, cam->id.lib, &cam_new->id);
 
 		for(ob= bmain->object.first; ob; ob= ob->id.next) {
 			if(ob->data == cam) {
 				if(ob->id.lib==NULL) {
-					ob->data= camn;
-					camn->id.us++;
+					ob->data= cam_new;
+					cam_new->id.us++;
 					cam->id.us--;
 				}
 			}

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c	2011-11-29 23:00:10 UTC (rev 42277)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c	2011-11-30 00:32:13 UTC (rev 42278)
@@ -274,16 +274,16 @@
 		extern_local_curve(cu);
 	}
 	else if(is_local && is_lib) {
-		Curve *cun= copy_curve(cu);
-		cun->id.us= 0;
+		Curve *cu_new= copy_curve(cu);
+		cu_new->id.us= 0;
 
-		BKE_id_lib_local_paths(bmain, &cun->id);
+		BKE_id_lib_local_paths(bmain, cu->id.lib, &cu_new->id);
 
 		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++;
+					ob->data= cu_new;
+					cu_new->id.us++;
 					cu->id.us--;
 				}
 			}

Modified: trunk/blender/source/blender/blenkernel/intern/image.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/image.c	2011-11-29 23:00:10 UTC (rev 42277)
+++ trunk/blender/source/blender/blenkernel/intern/image.c	2011-11-30 00:32:13 UTC (rev 42278)
@@ -385,19 +385,19 @@
 		extern_local_image(ima);
 	}
 	else if(is_local && is_lib) {
-		Image *iman= copy_image(ima);
+		Image *ima_new= copy_image(ima);
 
-		iman->id.us= 0;
+		ima_new->id.us= 0;
 
 		/* Remap paths of new ID using old library as base. */
-		BKE_id_lib_local_paths(bmain, &iman->id);
+		BKE_id_lib_local_paths(bmain, ima->id.lib, &ima_new->id);
 
 		tex= bmain->tex.first;
 		while(tex) {
 			if(tex->id.lib==NULL) {
 				if(tex->ima==ima) {
-					tex->ima = iman;
-					iman->id.us++;
+					tex->ima = ima_new;
+					ima_new->id.us++;
 					ima->id.us--;
 				}
 			}
@@ -407,8 +407,8 @@
 		while(brush) {
 			if(brush->id.lib==NULL) {
 				if(brush->clone.image==ima) {
-					brush->clone.image = iman;
-					iman->id.us++;
+					brush->clone.image = ima_new;
+					ima_new->id.us++;
 					ima->id.us--;
 				}
 			}
@@ -429,11 +429,11 @@
 
 						for(a=0; a<me->totface; a++, tface++) {	
 							if(tface->tpage == ima) {
-								tface->tpage = iman;
-								if(iman->id.us == 0) {
+								tface->tpage = ima_new;
+								if(ima_new->id.us == 0) {
 									tface->tpage->id.us= 1;
 								}
-								id_lib_extern((ID*)iman);
+								id_lib_extern((ID*)ima_new);
 							}
 						}
 					}

Modified: trunk/blender/source/blender/blenkernel/intern/lamp.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/lamp.c	2011-11-29 23:00:10 UTC (rev 42277)
+++ trunk/blender/source/blender/blenkernel/intern/lamp.c	2011-11-30 00:32:13 UTC (rev 42278)
@@ -184,19 +184,19 @@
 		id_clear_lib_data(bmain, &la->id);
 	}
 	else if(is_local && is_lib) {
-		Lamp *lan= copy_lamp(la);
-		lan->id.us= 0;
+		Lamp *la_new= copy_lamp(la);
+		la_new->id.us= 0;
 
 		/* Remap paths of new ID using old library as base. */
-		BKE_id_lib_local_paths(bmain, &lan->id);
+		BKE_id_lib_local_paths(bmain, la->id.lib, &la_new->id);
 
 		ob= bmain->object.first;
 		while(ob) {
 			if(ob->data==la) {
 				
 				if(ob->id.lib==NULL) {
-					ob->data= lan;
-					lan->id.us++;
+					ob->data= la_new;
+					la_new->id.us++;
 					la->id.us--;
 				}
 			}

Modified: trunk/blender/source/blender/blenkernel/intern/lattice.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/lattice.c	2011-11-29 23:00:10 UTC (rev 42277)
+++ trunk/blender/source/blender/blenkernel/intern/lattice.c	2011-11-30 00:32:13 UTC (rev 42278)
@@ -271,17 +271,17 @@
 		id_clear_lib_data(bmain, &lt->id);
 	}
 	else if(is_local && is_lib) {
-		Lattice *ltn= copy_lattice(lt);
-		ltn->id.us= 0;
+		Lattice *lt_new= copy_lattice(lt);
+		lt_new->id.us= 0;
 
 		/* Remap paths of new ID using old library as base. */
-		BKE_id_lib_local_paths(bmain, &ltn->id);
+		BKE_id_lib_local_paths(bmain, lt->id.lib, &lt_new->id);
 
 		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++;
+					ob->data= lt_new;
+					lt_new->id.us++;
 					lt->id.us--;
 				}
 			}

Modified: trunk/blender/source/blender/blenkernel/intern/library.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/library.c	2011-11-29 23:00:10 UTC (rev 42277)
+++ trunk/blender/source/blender/blenkernel/intern/library.c	2011-11-30 00:32:13 UTC (rev 42278)
@@ -136,9 +136,9 @@
  * from id_make_local() but then the make local functions would not be self
  * contained.
  * also note that the id _must_ have a library - campbell */
-void BKE_id_lib_local_paths(Main *bmain, ID *id)
+void BKE_id_lib_local_paths(Main *bmain, Library *lib, ID *id)
 {
-	char *bpath_user_data[2]= {bmain->name, (id)->lib->filepath};
+	char *bpath_user_data[2]= {bmain->name, lib->filepath};
 
 	bpath_traverse_id(bmain, id,
 					  bpath_relocate_visitor,
@@ -1278,7 +1278,7 @@
    don't have other library users. */
 void id_clear_lib_data(Main *bmain, ID *id)
 {
-	BKE_id_lib_local_paths(bmain, id);
+	BKE_id_lib_local_paths(bmain, id->lib, id);
 
 	id->lib= NULL;
 	id->flag= LIB_LOCAL;

Modified: trunk/blender/source/blender/blenkernel/intern/material.c

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list