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 947eafa..77ce7a5 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 e46e2df..ac0697d 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 c44ccd7..0c2ca4c 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 6e09aef..1e5b69d 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 45ab4a5..9ac0fab 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! */