void make_local_mesh(Mesh *me) { Main *bmain= G.main; Object *ob; int local=0, lib=0; /* - only lib users: do nothing * - only local users: set flag * - mixed: make copy */ if(me->id.lib==NULL) return; if(me->id.us==1) { me->id.lib= NULL; me->id.flag= LIB_LOCAL; new_id(&bmain->mesh, (ID *)me, NULL); expand_local_mesh(bmain, me); return; } for(ob= bmain->object.first; ob && ELEM(0, lib, local); ob= ob->id.next) { if(me == ob->data) { if(ob->id.lib) lib= 1; else local= 1; } } if(local && lib==0) { me->id.lib= NULL; me->id.flag= LIB_LOCAL; new_id(&bmain->mesh, (ID *)me, NULL); expand_local_mesh(bmain, me); } else if(local && lib) { Mesh *men= copy_mesh(me); men->id.us= 0; for(ob= bmain->object.first; ob; ob= ob->id.next) { if(me == ob->data) { if(ob->id.lib==NULL) { set_mesh(ob, men); } } } } }
void BKE_mesh_make_local(Mesh *me) { Main *bmain = G.main; Object *ob; int is_local = FALSE, is_lib = FALSE; /* - only lib users: do nothing * - only local users: set flag * - 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); 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; /* Remap paths of new ID using old library as base. */ BKE_id_lib_local_paths(bmain, me->id.lib, &me_new->id); 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); } } } } }