From f7d5cea669bd40de9c0aa5fc3aaa4c7f49f697a8 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 27 Oct 2011 05:34:39 +0000 Subject: use path remapping for all make local functions, patch from Alex Fraser with changes. --- source/blender/blenkernel/intern/material.c | 38 ++++++++++++++++------------- 1 file changed, 21 insertions(+), 17 deletions(-) (limited to 'source/blender/blenkernel/intern/material.c') diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 4fd2c3ff2fc..2ad3da9f3a0 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -50,6 +50,7 @@ #include "BLI_math.h" #include "BLI_listbase.h" #include "BLI_utildefines.h" +#include "BLI_bpath.h" #include "BKE_animsys.h" #include "BKE_displist.h" @@ -285,8 +286,7 @@ void make_local_material(Material *ma) Mesh *me; Curve *cu; MetaBall *mb; - Material *man; - int a, local=0, lib=0; + int a, is_local= FALSE, is_lib= FALSE; /* - only lib users: do nothing * - only local users: set flag @@ -297,7 +297,7 @@ void make_local_material(Material *ma) /* One local user; set flag and return. */ if(ma->id.us==1) { - id_clear_lib_data(bmain, (ID *)ma); + id_clear_lib_data(bmain, &ma->id); extern_local_material(ma); return; } @@ -310,8 +310,8 @@ void make_local_material(Material *ma) if(ob->mat) { for(a=0; atotcol; a++) { if(ob->mat[a]==ma) { - if(ob->id.lib) lib= 1; - else local= 1; + if(ob->id.lib) is_lib= TRUE; + else is_local= TRUE; } } } @@ -323,8 +323,8 @@ void make_local_material(Material *ma) if(me->mat) { for(a=0; atotcol; a++) { if(me->mat[a]==ma) { - if(me->id.lib) lib= 1; - else local= 1; + if(me->id.lib) is_lib= TRUE; + else is_local= TRUE; } } } @@ -336,8 +336,8 @@ void make_local_material(Material *ma) if(cu->mat) { for(a=0; atotcol; a++) { if(cu->mat[a]==ma) { - if(cu->id.lib) lib= 1; - else local= 1; + if(cu->id.lib) is_lib= TRUE; + else is_local= TRUE; } } } @@ -349,8 +349,8 @@ void make_local_material(Material *ma) if(mb->mat) { for(a=0; atotcol; a++) { if(mb->mat[a]==ma) { - if(mb->id.lib) lib= 1; - else local= 1; + if(mb->id.lib) is_lib= TRUE; + else is_local= TRUE; } } } @@ -358,16 +358,20 @@ void make_local_material(Material *ma) } /* Only local users. */ - if(local && lib==0) { - id_clear_lib_data(bmain, (ID *)ma); + if(is_local && is_lib == FALSE) { + id_clear_lib_data(bmain, &ma->id); extern_local_material(ma); } /* Both user and local, so copy. */ - else if(local && lib) { - - man= copy_material(ma); + else if(is_local && is_lib) { + char *bpath_user_data[2]= {bmain->name, ma->id.lib->filepath}; + Material *man= copy_material(ma); + man->id.us= 0; - + + /* Remap paths of new ID using old library as base. */ + bpath_traverse_id(bmain, &man->id, bpath_relocate_visitor, 0, bpath_user_data); + /* do objects */ ob= bmain->object.first; while(ob) { -- cgit v1.2.3