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

Reply via email to