[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41307] trunk/blender/source/blender: use path remapping for all make local functions, patch from Alex Fraser with changes.

Campbell Barton ideasman42 at gmail.com
Thu Oct 27 07:34:40 CEST 2011


Revision: 41307
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41307
Author:   campbellbarton
Date:     2011-10-27 05:34:39 +0000 (Thu, 27 Oct 2011)
Log Message:
-----------
use path remapping for all make local functions, patch from Alex Fraser with changes.

Modified Paths:
--------------
    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/image.c
    trunk/blender/source/blender/blenkernel/intern/key.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/blenlib/BLI_bpath.h
    trunk/blender/source/blender/blenlib/intern/bpath.c

Modified: trunk/blender/source/blender/blenkernel/intern/action.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/action.c	2011-10-27 04:24:34 UTC (rev 41306)
+++ trunk/blender/source/blender/blenkernel/intern/action.c	2011-10-27 05:34:39 UTC (rev 41307)
@@ -43,6 +43,7 @@
 #include "DNA_object_types.h"
 
 #include "BLI_blenlib.h"
+#include "BLI_bpath.h"
 #include "BLI_math.h"
 #include "BLI_utildefines.h"
 #include "BLI_ghash.h"
@@ -94,8 +95,8 @@
 	bAction *act;    /* original action */
 	bAction *actn;   /* new action */
 	
-	int lib;         /* some action users were libraries */
-	int local;       /* some action users were not libraries */
+	int is_lib;         /* some action users were libraries */
+	int is_local;       /* some action users were not libraries */
 } tMakeLocalActionContext;
 
 /* helper function for make_local_action() - local/lib init step */
@@ -104,10 +105,8 @@
 	tMakeLocalActionContext *mlac = (tMakeLocalActionContext *)mlac_ptr;
 	
 	if (adt->action == mlac->act) {
-		if (id->lib) 
-			mlac->lib = 1;
-		else 
-			mlac->local = 1;
+		if (id->lib) mlac->is_lib= TRUE;
+		else mlac->is_local= TRUE;
 	}
 }
 
@@ -129,7 +128,7 @@
 // does copy_fcurve...
 void make_local_action(bAction *act)
 {
-	tMakeLocalActionContext mlac = {act, NULL, 0, 0};
+	tMakeLocalActionContext mlac = {act, NULL, FALSE, FALSE};
 	Main *bmain= G.main;
 	
 	if (act->id.lib==NULL) 
@@ -137,19 +136,24 @@
 	
 	// XXX: double-check this; it used to be just single-user check, but that was when fake-users were still default
 	if ((act->id.flag & LIB_FAKEUSER) && (act->id.us<=1)) {
-		id_clear_lib_data(bmain, (ID *)act);
+		id_clear_lib_data(bmain, &act->id);
 		return;
 	}
 	
 	BKE_animdata_main_cb(bmain, make_localact_init_cb, &mlac);
 	
-	if (mlac.local && mlac.lib==0) {
-		id_clear_lib_data(bmain, (ID *)act);
+	if (mlac.is_local && mlac.is_lib==FALSE) {
+		id_clear_lib_data(bmain, &act->id);
 	}
-	else if (mlac.local && mlac.lib) {
+	else if (mlac.is_local && mlac.is_lib) {
+		char *bpath_user_data[2]= {bmain->name, act->id.lib->filepath};
+
 		mlac.actn= copy_action(act);
 		mlac.actn->id.us= 0;
-		
+
+		/* Remap paths of new ID using old library as base. */
+		bpath_traverse_id(bmain, &mlac.actn->id, bpath_relocate_visitor, 0, bpath_user_data);
+
 		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-10-27 04:24:34 UTC (rev 41306)
+++ trunk/blender/source/blender/blenkernel/intern/armature.c	2011-10-27 05:34:39 UTC (rev 41307)
@@ -37,6 +37,7 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "BLI_bpath.h"
 #include "BLI_math.h"
 #include "BLI_blenlib.h"
 #include "BLI_utildefines.h"
@@ -136,29 +137,33 @@
 void make_local_armature(bArmature *arm)
 {
 	Main *bmain= G.main;
-	int local=0, lib=0;
+	int is_local= FALSE, is_lib= FALSE;
 	Object *ob;
 
 	if (arm->id.lib==NULL) return;
 	if (arm->id.us==1) {
-		id_clear_lib_data(bmain, (ID *)arm);
+		id_clear_lib_data(bmain, &arm->id);
 		return;
 	}
 
-	for(ob= bmain->object.first; ob && ELEM(0, lib, local); ob= ob->id.next) {
+	for(ob= bmain->object.first; ob && ELEM(0, is_lib, is_local); ob= ob->id.next) {
 		if(ob->data == arm) {
-			if(ob->id.lib) lib= 1;
-			else local= 1;
+			if(ob->id.lib) is_lib= TRUE;
+			else is_local= TRUE;
 		}
 	}
 
-	if(local && lib==0) {
-		id_clear_lib_data(bmain, (ID *)arm);
+	if(is_local && is_lib == FALSE) {
+		id_clear_lib_data(bmain, &arm->id);
 	}
-	else if(local && lib) {
+	else if(is_local && is_lib) {
+		char *bpath_user_data[2]= {bmain->name, arm->id.lib->filepath};
 		bArmature *armn= copy_armature(arm);
 		armn->id.us= 0;
-		
+
+		/* Remap paths of new ID using old library as base. */
+		bpath_traverse_id(bmain, &armn->id, bpath_relocate_visitor, 0, bpath_user_data);
+
 		for(ob= bmain->object.first; ob; ob= ob->id.next) {
 			if(ob->data == arm) {
 				if(ob->id.lib==NULL) {

Modified: trunk/blender/source/blender/blenkernel/intern/brush.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/brush.c	2011-10-27 04:24:34 UTC (rev 41306)
+++ trunk/blender/source/blender/blenkernel/intern/brush.c	2011-10-27 05:34:39 UTC (rev 41307)
@@ -45,6 +45,7 @@
 
 #include "RNA_access.h"
 
+#include "BLI_bpath.h"
 #include "BLI_math.h"
 #include "BLI_blenlib.h"
 #include "BLI_rand.h"
@@ -194,26 +195,26 @@
 
 	Main *bmain= G.main;
 	Scene *scene;
-	int local= 0, lib= 0;
+	int is_local= FALSE, is_lib= FALSE;
 
 	if(brush->id.lib==NULL) return;
 
 	if(brush->clone.image) {
 		/* special case: ima always local immediately. Clone image should only
 		   have one user anyway. */
-		id_clear_lib_data(bmain, (ID *)brush->clone.image);
+		id_clear_lib_data(bmain, &brush->clone.image->id);
 		extern_local_brush(brush);
 	}
 
-	for(scene= bmain->scene.first; scene && ELEM(0, lib, local); scene=scene->id.next) {
+	for(scene= bmain->scene.first; scene && ELEM(0, is_lib, is_local); scene=scene->id.next) {
 		if(paint_brush(&scene->toolsettings->imapaint.paint)==brush) {
-			if(scene->id.lib) lib= 1;
-			else local= 1;
+			if(scene->id.lib) is_lib= TRUE;
+			else is_local= TRUE;
 		}
 	}
 
-	if(local && lib==0) {
-		id_clear_lib_data(bmain, (ID *)brush);
+	if(is_local && is_lib == FALSE) {
+		id_clear_lib_data(bmain, &brush->id);
 		extern_local_brush(brush);
 
 		/* enable fake user by default */
@@ -222,10 +223,14 @@
 			brush->id.us++;
 		}
 	}
-	else if(local && lib) {
+	else if(is_local && is_lib) {
+		char *bpath_user_data[2]= {bmain->name, brush->id.lib->filepath};
 		Brush *brushn= copy_brush(brush);
 		brushn->id.us= 1; /* only keep fake user */
 		brushn->id.flag |= LIB_FAKEUSER;
+
+		/* Remap paths of new ID using old library as base. */
+		bpath_traverse_id(bmain, &brushn->id, bpath_relocate_visitor, 0, bpath_user_data);
 		
 		for(scene= bmain->scene.first; scene; scene=scene->id.next) {
 			if(paint_brush(&scene->toolsettings->imapaint.paint)==brush) {

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c	2011-10-27 04:24:34 UTC (rev 41306)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c	2011-10-27 05:34:39 UTC (rev 41307)
@@ -36,6 +36,7 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "BLI_bpath.h"
 #include "BLI_blenlib.h"
 #include "BLI_math.h"
 #include "BLI_utildefines.h"
@@ -245,7 +246,7 @@
 {
 	Main *bmain= G.main;
 	Object *ob;
-	int local=0, lib=0;
+	int is_local= FALSE, is_lib= FALSE;
 	
 	/* - when there are only lib users: don't do
 	 * - when there are only local users: set flag
@@ -255,26 +256,31 @@
 	if(cu->id.lib==NULL) return;
 
 	if(cu->id.us==1) {
-		id_clear_lib_data(bmain, (ID *)cu);
+		id_clear_lib_data(bmain, &cu->id);
 		extern_local_curve(cu);
 		return;
 	}
 
-	for(ob= bmain->object.first; ob && ELEM(0, lib, local); ob= ob->id.next) {
+	for(ob= bmain->object.first; ob && ELEM(0, is_lib, is_local); ob= ob->id.next) {
 		if(ob->data == cu) {
-			if(ob->id.lib) lib= 1;
-			else local= 1;
+			if(ob->id.lib) is_lib= TRUE;
+			else is_local= TRUE;
 		}
 	}
 
-	if(local && lib==0) {
-		id_clear_lib_data(bmain, (ID *)cu);
+	if(is_local && is_lib == FALSE) {
+		id_clear_lib_data(bmain, &cu->id);
 		extern_local_curve(cu);
 	}
-	else if(local && lib) {
+	else if(is_local && is_lib) {
+		char *bpath_user_data[2]= {bmain->name, cu->id.lib->filepath};
 		Curve *cun= copy_curve(cu);
 		cun->id.us= 0;
 
+
+		/* Remap paths of new ID using old library as base. */
+		bpath_traverse_id(bmain, &cun->id, bpath_relocate_visitor, 0, bpath_user_data);
+
 		for(ob= bmain->object.first; ob; ob= ob->id.next) {
 			if(ob->data==cu) {
 				if(ob->id.lib==NULL) {

Modified: trunk/blender/source/blender/blenkernel/intern/image.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/image.c	2011-10-27 04:24:34 UTC (rev 41306)
+++ trunk/blender/source/blender/blenkernel/intern/image.c	2011-10-27 05:34:39 UTC (rev 41307)
@@ -329,7 +329,7 @@
 	Tex *tex;
 	Brush *brush;
 	Mesh *me;
-	int local=0, lib=0;
+	int is_local= FALSE, is_lib= FALSE;
 
 	/* - only lib users: do nothing
 	 * - only local users: set flag
@@ -342,7 +342,7 @@
 	   texface ID refs. - z0r */
 #if 0
 	if(ima->id.us==1) {
-		id_clear_lib_data(bmain, (ID *)ima);
+		id_clear_lib_data(bmain, &ima->id);
 		extern_local_image(ima);
 		return;
 	}
@@ -350,14 +350,14 @@
 
 	for(tex= bmain->tex.first; tex; tex= tex->id.next) {
 		if(tex->ima == ima) {
-			if(tex->id.lib) lib= 1;
-			else local= 1;
+			if(tex->id.lib) is_lib= TRUE;
+			else is_local= TRUE;
 		}
 	}
 	for(brush= bmain->brush.first; brush; brush= brush->id.next) {
 		if(brush->clone.image == ima) {
-			if(brush->id.lib) lib= 1;
-			else local= 1;
+			if(brush->id.lib) is_lib= TRUE;
+			else is_local= TRUE;
 		}
 	}
 	for(me= bmain->mesh.first; me; me= me->id.next) {
@@ -371,8 +371,8 @@
 
 					for(a=0; a<me->totface; a++, tface++) {
 						if(tface->tpage == ima) {
-							if(me->id.lib) lib=1;
-							else local= 1;
+							if(me->id.lib) is_lib= TRUE;
+							else is_local= TRUE;
 						}
 					}
 				}
@@ -380,18 +380,18 @@
 		}
 	}
 
-	if(local && lib==0) {
-		id_clear_lib_data(bmain, (ID *)ima);
+	if(is_local && is_lib == FALSE) {
+		id_clear_lib_data(bmain, &ima->id);
 		extern_local_image(ima);
 	}
-	else if(local && lib) {
+	else if(is_local && is_lib) {
+		char *bpath_user_data[2]= {bmain->name, ima->id.lib->filepath};
 		Image *iman= copy_image(ima);
-		char *user_data[2]= {bmain->name, iman->id.lib->filepath};
 
 		iman->id.us= 0;
 
 		/* Remap paths of new ID using old library as base. */
-		bpath_traverse_id(bmain, &iman->id, bpath_relocate_visitor, 0, user_data);
+		bpath_traverse_id(bmain, &iman->id, bpath_relocate_visitor, 0, bpath_user_data);
 
 		tex= bmain->tex.first;
 		while(tex) {

Modified: trunk/blender/source/blender/blenkernel/intern/key.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/key.c	2011-10-27 04:24:34 UTC (rev 41306)
+++ trunk/blender/source/blender/blenkernel/intern/key.c	2011-10-27 05:34:39 UTC (rev 41307)
@@ -181,7 +181,7 @@
 	if(key==NULL) return;
 	
 	key->id.lib= NULL;
-	new_id(NULL, (ID *)key, NULL);
+	new_id(NULL, &key->id, NULL);
 }
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list