Commit: 429394078bde004f608e0f9ba9937421ab35edfd
Author: Bastien Montagne
Date:   Sat Jul 9 15:38:02 2016 +0200
Branches: master
https://developer.blender.org/rB429394078bde004f608e0f9ba9937421ab35edfd

Refactor/enhance BKE_lattice_make_local(), and add BKE_lattice_copy_ex() that 
takes a Main as parameter.

Now using modern features from libquery/libremap areas.

Provides same kind of fixes/improvements as for BKE_object_make_local() (see 
rBd1a4ae3f395a6).

===================================================================

M       source/blender/blenkernel/BKE_lattice.h
M       source/blender/blenkernel/intern/lattice.c
M       source/blender/blenkernel/intern/library.c
M       source/blender/editors/object/object_add.c
M       source/blender/editors/object/object_relations.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_lattice.h 
b/source/blender/blenkernel/BKE_lattice.h
index 828a40d..a825252 100644
--- a/source/blender/blenkernel/BKE_lattice.h
+++ b/source/blender/blenkernel/BKE_lattice.h
@@ -48,8 +48,9 @@ void BKE_lattice_resize(struct Lattice *lt, int u, int v, int 
w, struct Object *
 void BKE_lattice_init(struct Lattice *lt);
 struct Lattice *BKE_lattice_add(struct Main *bmain, const char *name);
 struct Lattice *BKE_lattice_copy(struct Lattice *lt);
+struct Lattice *BKE_lattice_copy_ex(struct Main *bmain, struct Lattice *lt);
 void BKE_lattice_free(struct Lattice *lt);
-void BKE_lattice_make_local(struct Lattice *lt);
+void BKE_lattice_make_local(struct Main *bmain, struct Lattice *lt);
 void calc_lat_fudu(int flag, int res, float *r_fu, float *r_du);
 
 struct LatticeDeformData;
diff --git a/source/blender/blenkernel/intern/lattice.c 
b/source/blender/blenkernel/intern/lattice.c
index 9bf417c..3e03690 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -59,6 +59,8 @@
 #include "BKE_key.h"
 #include "BKE_lattice.h"
 #include "BKE_library.h"
+#include "BKE_library_query.h"
+#include "BKE_library_remap.h"
 #include "BKE_main.h"
 #include "BKE_modifier.h"
 #include "BKE_object.h"
@@ -275,11 +277,11 @@ Lattice *BKE_lattice_add(Main *bmain, const char *name)
        return lt;
 }
 
-Lattice *BKE_lattice_copy(Lattice *lt)
+Lattice *BKE_lattice_copy_ex(Main *bmain, Lattice *lt)
 {
        Lattice *ltn;
 
-       ltn = BKE_libblock_copy(&lt->id);
+       ltn = BKE_libblock_copy_ex(bmain, &lt->id);
        ltn->def = MEM_dupallocN(lt->def);
 
        if (lt->key) {
@@ -296,12 +298,17 @@ Lattice *BKE_lattice_copy(Lattice *lt)
        ltn->editlatt = NULL;
 
        if (ID_IS_LINKED_DATABLOCK(lt)) {
-               BKE_id_lib_local_paths(G.main, lt->id.lib, &ltn->id);
+               BKE_id_lib_local_paths(bmain, lt->id.lib, &ltn->id);
        }
 
        return ltn;
 }
 
+Lattice *BKE_lattice_copy(Lattice *lt)
+{
+       return BKE_lattice_copy_ex(G.main, lt);
+}
+
 /** Free (or release) any data used by this lattice (does not free the lattice 
itself). */
 void BKE_lattice_free(Lattice *lt)
 {
@@ -327,54 +334,38 @@ void BKE_lattice_free(Lattice *lt)
 }
 
 
-void BKE_lattice_make_local(Lattice *lt)
+void BKE_lattice_make_local(Main *bmain, Lattice *lt)
 {
-       Main *bmain = G.main;
-       Object *ob;
        bool is_local = false, is_lib = false;
 
        /* - only lib users: do nothing
         * - only local users: set flag
         * - mixed: make copy
         */
-       
-       if (!ID_IS_LINKED_DATABLOCK(lt)) return;
-       if (lt->id.us == 1) {
-               id_clear_lib_data(bmain, &lt->id);
-               if (lt->key) {
-                       BKE_key_make_local(bmain, lt->key);
-               }
+
+       if (!ID_IS_LINKED_DATABLOCK(lt)) {
                return;
        }
-       
-       for (ob = bmain->object.first; ob && ELEM(false, is_lib, is_local); ob 
= ob->id.next) {
-               if (ob->data == lt) {
-                       if (ID_IS_LINKED_DATABLOCK(ob)) is_lib = true;
-                       else is_local = true;
-               }
-       }
-       
-       if (is_local && is_lib == false) {
-               id_clear_lib_data(bmain, &lt->id);
-               if (lt->key) {
-                       BKE_key_make_local(bmain, lt->key);
-               }
-       }
-       else if (is_local && is_lib) {
-               Lattice *lt_new = BKE_lattice_copy(lt);
-               lt_new->id.us = 0;
 
-               /* Remap paths of new ID using old library as base. */
-               BKE_id_lib_local_paths(bmain, lt->id.lib, &lt_new->id);
+       BKE_library_ID_test_usages(bmain, lt, &is_local, &is_lib);
 
-               for (ob = bmain->object.first; ob; ob = ob->id.next) {
-                       if (ob->data == lt) {
-                               if (!ID_IS_LINKED_DATABLOCK(ob)) {
-                                       ob->data = lt_new;
-                                       id_us_plus(&lt_new->id);
-                                       id_us_min(&lt->id);
-                               }
+       if (is_local) {
+               if (!is_lib) {
+                       id_clear_lib_data(bmain, &lt->id);
+                       if (lt->key) {
+                               BKE_key_make_local(bmain, lt->key);
                        }
+                       /* No extern_local_lattice... */
+               }
+               else {
+                       Lattice *lt_new = BKE_lattice_copy_ex(bmain, lt);
+
+                       lt_new->id.us = 0;
+
+                       /* Remap paths of new ID using old library as base. */
+                       BKE_id_lib_local_paths(bmain, lt->id.lib, &lt_new->id);
+
+                       BKE_libblock_remap(bmain, lt, lt_new, 
ID_REMAP_SKIP_INDIRECT_USAGE);
                }
        }
 }
diff --git a/source/blender/blenkernel/intern/library.c 
b/source/blender/blenkernel/intern/library.c
index 80bd1e9..fa63e7a 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -285,7 +285,7 @@ bool id_make_local(Main *bmain, ID *id, bool test)
                        if (!test) BKE_image_make_local((Image *)id);
                        return true;
                case ID_LT:
-                       if (!test) BKE_lattice_make_local((Lattice *)id);
+                       if (!test) BKE_lattice_make_local(bmain, (Lattice *)id);
                        return true;
                case ID_LA:
                        if (!test) BKE_lamp_make_local((Lamp *)id);
diff --git a/source/blender/editors/object/object_add.c 
b/source/blender/editors/object/object_add.c
index aac9dcf..2ea3920 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -2050,7 +2050,7 @@ static Base *object_add_duplicate_internal(Main *bmain, 
Scene *scene, Base *base
                                if (dupflag != 0) {
                                        ID_NEW_US2(obn->data)
                                        else {
-                                               obn->data = 
BKE_lattice_copy(obn->data);
+                                               obn->data = 
BKE_lattice_copy_ex(bmain, obn->data);
                                                didit = 1;
                                        }
                                        id_us_min(id);
diff --git a/source/blender/editors/object/object_relations.c 
b/source/blender/editors/object/object_relations.c
index 2e9db53..bf2dc55 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -1893,7 +1893,7 @@ static void single_obdata_users(Main *bmain, Scene 
*scene, const int flag)
                                                        
BKE_animdata_copy_id_action((ID *)cu->key);
                                                break;
                                        case OB_LATTICE:
-                                               ob->data = lat = 
BKE_lattice_copy(ob->data);
+                                               ob->data = lat = 
BKE_lattice_copy_ex(bmain, ob->data);
                                                if (lat->key)
                                                        
BKE_animdata_copy_id_action((ID *)lat->key);
                                                break;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to