diff options
Diffstat (limited to 'source/blender/blenkernel/intern/mesh.c')
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 146 |
1 files changed, 36 insertions, 110 deletions
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index f82e5cf61b3..787b9905734 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -49,6 +49,8 @@ #include "BKE_mesh.h" #include "BKE_displist.h" #include "BKE_library.h" +#include "BKE_library_query.h" +#include "BKE_library_remap.h" #include "BKE_material.h" #include "BKE_modifier.h" #include "BKE_multires.h" @@ -491,15 +493,13 @@ Mesh *BKE_mesh_add(Main *bmain, const char *name) return me; } -Mesh *BKE_mesh_copy_ex(Main *bmain, Mesh *me) +Mesh *BKE_mesh_copy(Main *bmain, Mesh *me) { Mesh *men; - MTFace *tface; - MTexPoly *txface; - int a, i; + int a; const int do_tessface = ((me->totface != 0) && (me->totpoly == 0)); /* only do tessface if we have no polys */ - men = BKE_libblock_copy_ex(bmain, &me->id); + men = BKE_libblock_copy(bmain, &me->id); men->mat = MEM_dupallocN(me->mat); for (a = 0; a < men->totcol; a++) { @@ -520,53 +520,32 @@ Mesh *BKE_mesh_copy_ex(Main *bmain, Mesh *me) BKE_mesh_update_customdata_pointers(men, do_tessface); - /* ensure indirect linked data becomes lib-extern */ - for (i = 0; i < me->fdata.totlayer; i++) { - if (me->fdata.layers[i].type == CD_MTFACE) { - tface = (MTFace *)me->fdata.layers[i].data; - - for (a = 0; a < me->totface; a++, tface++) - if (tface->tpage) - id_lib_extern((ID *)tface->tpage); - } - } - - for (i = 0; i < me->pdata.totlayer; i++) { - if (me->pdata.layers[i].type == CD_MTEXPOLY) { - txface = (MTexPoly *)me->pdata.layers[i].data; - - for (a = 0; a < me->totpoly; a++, txface++) - if (txface->tpage) - id_lib_extern((ID *)txface->tpage); - } - } - men->edit_btmesh = NULL; men->mselect = MEM_dupallocN(men->mselect); men->bb = MEM_dupallocN(men->bb); - - men->key = BKE_key_copy(me->key); - if (men->key) men->key->from = (ID *)men; - if (me->id.lib) { + if (me->key) { + men->key = BKE_key_copy(bmain, me->key); + men->key->from = (ID *)men; + } + + if (ID_IS_LINKED_DATABLOCK(me)) { + BKE_id_expand_local(&men->id); BKE_id_lib_local_paths(bmain, me->id.lib, &men->id); } return men; } -Mesh *BKE_mesh_copy(Mesh *me) -{ - return BKE_mesh_copy_ex(G.main, me); -} - -BMesh *BKE_mesh_to_bmesh(Mesh *me, Object *ob, const bool add_key_index) +BMesh *BKE_mesh_to_bmesh( + Mesh *me, Object *ob, + const bool add_key_index, const struct BMeshCreateParams *params) { BMesh *bm; const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(me); - bm = BM_mesh_create(&allocsize); + bm = BM_mesh_create(&allocsize, params); BM_mesh_bm_from_me( bm, me, (&(struct BMeshFromMeshParams){ @@ -576,49 +555,8 @@ BMesh *BKE_mesh_to_bmesh(Mesh *me, Object *ob, const bool add_key_index) return bm; } -static void expand_local_mesh(Mesh *me) -{ - id_lib_extern((ID *)me->texcomesh); - - if (me->mtface || me->mtpoly) { - int a, i; - - for (i = 0; i < me->pdata.totlayer; i++) { - if (me->pdata.layers[i].type == CD_MTEXPOLY) { - MTexPoly *txface = (MTexPoly *)me->pdata.layers[i].data; - - for (a = 0; a < me->totpoly; a++, txface++) { - /* special case: ima always local immediately */ - if (txface->tpage) { - id_lib_extern((ID *)txface->tpage); - } - } - } - } - - for (i = 0; i < me->fdata.totlayer; i++) { - if (me->fdata.layers[i].type == CD_MTFACE) { - MTFace *tface = (MTFace *)me->fdata.layers[i].data; - - for (a = 0; a < me->totface; a++, tface++) { - /* special case: ima always local immediately */ - if (tface->tpage) { - id_lib_extern((ID *)tface->tpage); - } - } - } - } - } - - if (me->mat) { - extern_local_matarar(me->mat, me->totcol); - } -} - -void BKE_mesh_make_local(Mesh *me) +void BKE_mesh_make_local(Main *bmain, Mesh *me) { - Main *bmain = G.main; - Object *ob; bool is_local = false, is_lib = false; /* - only lib users: do nothing @@ -626,38 +564,26 @@ void BKE_mesh_make_local(Mesh *me) * - mixed: make copy */ - if (me->id.lib == NULL) return; - if (me->id.us == 1) { - id_clear_lib_data(bmain, &me->id); - expand_local_mesh(me); + if (!ID_IS_LINKED_DATABLOCK(me)) { return; } - for (ob = bmain->object.first; ob && ELEM(0, is_lib, is_local); ob = ob->id.next) { - if (me == ob->data) { - if (ob->id.lib) is_lib = true; - else is_local = true; - } - } - - if (is_local && is_lib == false) { - id_clear_lib_data(bmain, &me->id); - expand_local_mesh(me); - } - else if (is_local && is_lib) { - Mesh *me_new = BKE_mesh_copy(me); - me_new->id.us = 0; + BKE_library_ID_test_usages(bmain, me, &is_local, &is_lib); + if (is_local) { + if (!is_lib) { + id_clear_lib_data(bmain, &me->id); + if (me->key) { + BKE_key_make_local(bmain, me->key); + } + BKE_id_expand_local(&me->id); + } + else { + Mesh *me_new = BKE_mesh_copy(bmain, me); - /* Remap paths of new ID using old library as base. */ - BKE_id_lib_local_paths(bmain, me->id.lib, &me_new->id); + me_new->id.us = 0; - for (ob = bmain->object.first; ob; ob = ob->id.next) { - if (me == ob->data) { - if (ob->id.lib == NULL) { - BKE_mesh_assign_object(ob, me_new); - } - } + BKE_libblock_remap(bmain, me, me_new, ID_REMAP_SKIP_INDIRECT_USAGE); } } } @@ -1008,7 +934,7 @@ void BKE_mesh_assign_object(Object *ob, Mesh *me) id_us_plus((ID *)me); } - test_object_materials(G.main, (ID *)me); + test_object_materials(ob, (ID *)me); test_object_modifiers(ob); } @@ -2338,7 +2264,7 @@ Mesh *BKE_mesh_new_from_object( BKE_object_free_modifiers(tmpobj); /* copies the data */ - copycu = tmpobj->data = BKE_curve_copy((Curve *) ob->data); + copycu = tmpobj->data = BKE_curve_copy(bmain, (Curve *) ob->data); /* temporarily set edit so we get updates from edit mode, but * also because for text datablocks copying it while in edit @@ -2419,7 +2345,7 @@ Mesh *BKE_mesh_new_from_object( /* copies object and modifiers (but not the data) */ if (cage) { /* copies the data */ - tmpmesh = BKE_mesh_copy_ex(bmain, ob->data); + tmpmesh = BKE_mesh_copy(bmain, ob->data); /* if not getting the original caged mesh, get final derived mesh */ } else { @@ -2516,8 +2442,8 @@ Mesh *BKE_mesh_new_from_object( BKE_mesh_tessface_ensure(tmpmesh); } - /* make sure materials get updated in objects */ - test_object_materials(bmain, &tmpmesh->id); + /* make sure materials get updated in object */ + test_object_materials(tmpobj ? tmpobj : ob, &tmpmesh->id); return tmpmesh; } |