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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to