Fix [#28772] Filepaths are not remmaped after making a library item local
authorAlex Fraser <alex@phatcore.com>
Wed, 26 Oct 2011 10:49:21 +0000 (10:49 +0000)
committerAlex Fraser <alex@phatcore.com>
Wed, 26 Oct 2011 10:49:21 +0000 (10:49 +0000)
Added a visitor function to simplify processing of file paths that are attached to IDs. This is used for images, and could be used for other ID types in future.
Code reviewed by ideasman_42.

source/blender/blenkernel/BKE_library.h
source/blender/blenkernel/intern/action.c
source/blender/blenkernel/intern/library.c
source/blender/blenkernel/intern/object.c
source/blender/blenloader/intern/readfile.c

index 947eafa9dd3796ce710f53042784a003f58f1fc6..77ce7a50956de6cdf3be01dff4fe14b6e37d9094 100644 (file)
@@ -59,6 +59,7 @@ int id_copy(struct ID *id, struct ID **newid, int test);
 int id_unlink(struct ID *id, int test);
 
 int new_id(struct ListBase *lb, struct ID *id, const char *name);
+void id_clear_lib_data(struct ListBase *lb, struct ID *id);
 
 struct ListBase *which_libbase(struct Main *mainlib, short type);
 
index e46e2df83530ecbc4427be62573d8fa4807f79e7..ac0697ddbf92840bc93cabe1a8793b9bc7a36955 100644 (file)
@@ -137,19 +137,14 @@ void make_local_action(bAction *act)
        
        // 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)) {
-               act->id.lib= NULL;
-               act->id.flag= LIB_LOCAL;
-               new_id(&bmain->action, (ID *)act, NULL);
+               id_clear_lib_data(&bmain->action, (ID *)act);
                return;
        }
        
        BKE_animdata_main_cb(bmain, make_localact_init_cb, &mlac);
        
        if (mlac.local && mlac.lib==0) {
-               act->id.lib= NULL;
-               act->id.flag= LIB_LOCAL;
-               //make_local_action_channels(act);
-               new_id(&bmain->action, (ID *)act, NULL);
+               id_clear_lib_data(&bmain->action, (ID *)act);
        }
        else if (mlac.local && mlac.lib) {
                mlac.actn= copy_action(act);
index c44ccd7aa579fb3710675e51d90c876fb80d0c87..0c2ca4c68b36d7b7a08663479038358d1dd4f482 100644 (file)
@@ -74,7 +74,7 @@
 #include "BLI_blenlib.h"
 #include "BLI_dynstr.h"
 #include "BLI_utildefines.h"
-
+#include "BLI_bpath.h"
 
 #include "BKE_animsys.h"
 #include "BKE_context.h"
 #include "BKE_gpencil.h"
 #include "BKE_fcurve.h"
 #include "BKE_speaker.h"
+#include "BKE_utildefines.h"
 
 #include "RNA_access.h"
 
@@ -194,7 +195,8 @@ int id_make_local(ID *id, int test)
                        if(!test) make_local_texture((Tex*)id);
                        return 1;
                case ID_IM:
-                       return 0; /* not implemented */
+                       if(!test) make_local_image((Image*)id);
+                       return 1;
                case ID_LT:
                        if(!test) {
                                make_local_lattice((Lattice*)id);
@@ -1246,6 +1248,16 @@ int new_id(ListBase *lb, ID *id, const char *tname)
        return result;
 }
 
+/* Pull an ID out of a library (make it local). Only call this for IDs that
+   don't have other library users. */
+void id_clear_lib_data(ListBase *lb, ID *id)
+{
+       bpath_traverse_id(id, bpath_relocate_visitor, id->lib->filepath);
+       id->lib= NULL;
+       id->flag= LIB_LOCAL;
+       new_id(lb, id, NULL);
+}
+
 /* next to indirect usage in read/writefile also in editobject.c scene.c */
 void clear_id_newpoins(void)
 {
index 6e09aefeea2cf3622200200327979120269f35b8..1e5b69dc4ee7cf87d9dd5348c6c79fb63e2dab63 100644 (file)
@@ -1083,7 +1083,6 @@ Object *add_only_object(int type, const char *name)
        /* ob->pad3 == Contact Processing Threshold */
        ob->m_contactProcessingThreshold = 1.;
        ob->obstacleRad = 1.;
-       ob->col_group = ob->col_mask = 1;
        
        /* NT fluid sim defaults */
        ob->fluidsimFlag = 0;
index 45ab4a5cdaf1dc13363276ccb9700df2fd7033de..9ac0fab3b811a89adf9583068bea7ca3f5226273 100644 (file)
@@ -10464,6 +10464,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
                        sce->gm.dome.warptext = sce->r.dometext;
 
                        //Stand Alone
+                       sce->gm.fullscreen = sce->r.fullscreen;
                        sce->gm.xplay = sce->r.xplay;
                        sce->gm.yplay = sce->r.yplay;
                        sce->gm.freqplay = sce->r.freqplay;
@@ -12190,22 +12191,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
                                }
                        }
                }
-
-               {
-                       /* Initialize BGE exit key to esc key */
-                       Scene *scene;
-                       for(scene= main->scene.first; scene; scene= scene->id.next) {
-                               if (!scene->gm.exitkey)
-                                       scene->gm.exitkey = 218; //218 is the Blender key code for ESC
-                       }
-               }
-
-               {
-                       /* Initialize default values for collision masks */
-                       Object *ob;
-                       for(ob=main->object.first; ob; ob=ob->id.next)
-                               ob->col_group = ob->col_mask = 1;
-               }
        }
 
        /* WATCH IT!!!: pointers from libdata have not been converted yet here! */