Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2016-07-11 20:13:42 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2016-07-11 22:30:02 +0300
commit2ec17e655c4fdabc6251b5c81f4404451160923c (patch)
treee733b30bb19cfc0037ffae8a01bac3c57334ebac
parent439ccca1e0b7078f3055ec14a7c81e964594ae6b (diff)
Use new generic BKE_id_expand_local() for both make_local() and copy() functions of obdata
(armature, mesh, curve, mball, lattice, lamp, camera, and speaker). This greatly simplifies said code, once again no change expected from user PoV.
-rw-r--r--source/blender/blenkernel/intern/armature.c3
-rw-r--r--source/blender/blenkernel/intern/camera.c3
-rw-r--r--source/blender/blenkernel/intern/curve.c31
-rw-r--r--source/blender/blenkernel/intern/lamp.c27
-rw-r--r--source/blender/blenkernel/intern/lattice.c5
-rw-r--r--source/blender/blenkernel/intern/mball.c23
-rw-r--r--source/blender/blenkernel/intern/mesh.c79
-rw-r--r--source/blender/blenkernel/intern/speaker.c21
8 files changed, 28 insertions, 164 deletions
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 2473dbee2a3..3850e4b5bf0 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -162,6 +162,7 @@ void BKE_armature_make_local(Main *bmain, bArmature *arm)
if (is_local) {
if (!is_lib) {
id_clear_lib_data(bmain, &arm->id);
+ BKE_id_expand_local(&arm->id, false);
}
else {
bArmature *arm_new = BKE_armature_copy(bmain, arm);
@@ -221,6 +222,8 @@ bArmature *BKE_armature_copy(Main *bmain, bArmature *arm)
newArm->act_edbone = NULL;
newArm->sketch = NULL;
+ BKE_id_expand_local(&newArm->id, true);
+
if (ID_IS_LINKED_DATABLOCK(arm)) {
BKE_id_lib_local_paths(bmain, arm->id.lib, &newArm->id);
}
diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c
index 8336c1fb3fb..8ae714d6d94 100644
--- a/source/blender/blenkernel/intern/camera.c
+++ b/source/blender/blenkernel/intern/camera.c
@@ -99,7 +99,7 @@ Camera *BKE_camera_copy(Main *bmain, Camera *cam)
camn = BKE_libblock_copy(bmain, &cam->id);
- id_lib_extern((ID *)camn->dof_ob);
+ BKE_id_expand_local(&camn->id, true);
if (ID_IS_LINKED_DATABLOCK(cam)) {
BKE_id_lib_local_paths(bmain, cam->id.lib, &camn->id);
@@ -126,6 +126,7 @@ void BKE_camera_make_local(Main *bmain, Camera *cam)
if (is_local) {
if (!is_lib) {
id_clear_lib_data(bmain, &cam->id);
+ BKE_id_expand_local(&cam->id, false);
}
else {
Camera *cam_new = BKE_camera_copy(bmain, cam);
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 3a7be948760..4fb2cda3a2c 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -177,7 +177,6 @@ Curve *BKE_curve_add(Main *bmain, const char *name, int type)
Curve *BKE_curve_copy(Main *bmain, Curve *cu)
{
Curve *cun;
- int a;
cun = BKE_libblock_copy(bmain, &cu->id);
@@ -185,9 +184,6 @@ Curve *BKE_curve_copy(Main *bmain, Curve *cu)
BKE_nurbList_duplicate(&(cun->nurb), &(cu->nurb));
cun->mat = MEM_dupallocN(cu->mat);
- for (a = 0; a < cun->totcol; a++) {
- id_us_plus((ID *)cun->mat[a]);
- }
cun->str = MEM_dupallocN(cu->str);
cun->strinfo = MEM_dupallocN(cu->strinfo);
@@ -196,21 +192,14 @@ Curve *BKE_curve_copy(Main *bmain, Curve *cu)
if (cu->key) {
cun->key = BKE_key_copy(bmain, cu->key);
+ cun->key->id.us = 0; /* Will be increased again by BKE_id_expand_local. */
cun->key->from = (ID *)cun;
}
cun->editnurb = NULL;
cun->editfont = NULL;
-#if 0 // XXX old animation system
- /* single user ipo too */
- if (cun->ipo) cun->ipo = copy_ipo(cun->ipo);
-#endif // XXX old animation system
-
- id_us_plus((ID *)cun->vfont);
- id_us_plus((ID *)cun->vfontb);
- id_us_plus((ID *)cun->vfonti);
- id_us_plus((ID *)cun->vfontbi);
+ BKE_id_expand_local(&cun->id, true);
if (ID_IS_LINKED_DATABLOCK(cu)) {
BKE_id_lib_local_paths(bmain, cu->id.lib, &cun->id);
@@ -219,21 +208,6 @@ Curve *BKE_curve_copy(Main *bmain, Curve *cu)
return cun;
}
-static int extern_local_curve_callback(
- void *UNUSED(user_data), struct ID *UNUSED(id_self), struct ID **id_pointer, int cd_flag)
-{
- /* We only tag usercounted ID usages as extern... Why? */
- if ((cd_flag & IDWALK_USER) && *id_pointer) {
- id_lib_extern(*id_pointer);
- }
- return IDWALK_RET_NOP;
-}
-
-static void extern_local_curve(Curve *cu)
-{
- BKE_library_foreach_ID_link(&cu->id, extern_local_curve_callback, NULL, 0);
-}
-
void BKE_curve_make_local(Main *bmain, Curve *cu)
{
bool is_local = false, is_lib = false;
@@ -255,7 +229,6 @@ void BKE_curve_make_local(Main *bmain, Curve *cu)
if (cu->key) {
BKE_key_make_local(bmain, cu->key);
}
- extern_local_curve(cu);
}
else {
Curve *cu_new = BKE_curve_copy(bmain, cu);
diff --git a/source/blender/blenkernel/intern/lamp.c b/source/blender/blenkernel/intern/lamp.c
index 3e656a2433d..e1aec61d3f6 100644
--- a/source/blender/blenkernel/intern/lamp.c
+++ b/source/blender/blenkernel/intern/lamp.c
@@ -127,7 +127,6 @@ Lamp *BKE_lamp_copy(Main *bmain, Lamp *la)
if (lan->mtex[a]) {
lan->mtex[a] = MEM_mallocN(sizeof(MTex), "copylamptex");
memcpy(lan->mtex[a], la->mtex[a], sizeof(MTex));
- id_us_plus((ID *)lan->mtex[a]->tex);
}
}
@@ -136,9 +135,10 @@ Lamp *BKE_lamp_copy(Main *bmain, Lamp *la)
if (la->nodetree)
lan->nodetree = ntreeCopyTree(bmain, la->nodetree);
- if (la->preview)
- lan->preview = BKE_previewimg_copy(la->preview);
-
+ lan->preview = BKE_previewimg_copy(la->preview);
+
+ BKE_id_expand_local(&lan->id, true);
+
if (ID_IS_LINKED_DATABLOCK(la)) {
BKE_id_lib_local_paths(bmain, la->id.lib, &lan->id);
}
@@ -167,26 +167,11 @@ Lamp *localize_lamp(Lamp *la)
if (la->nodetree)
lan->nodetree = ntreeLocalize(la->nodetree);
- lan->preview = BKE_previewimg_copy(la->preview);
+ lan->preview = NULL;
return lan;
}
-static int extern_local_lamp_callback(
- void *UNUSED(user_data), struct ID *UNUSED(id_self), struct ID **id_pointer, int cd_flag)
-{
- /* We only tag usercounted ID usages as extern... Why? */
- if ((cd_flag & IDWALK_USER) && *id_pointer) {
- id_lib_extern(*id_pointer);
- }
- return IDWALK_RET_NOP;
-}
-
-static void extern_local_lamp(Lamp *la)
-{
- BKE_library_foreach_ID_link(&la->id, extern_local_lamp_callback, NULL, 0);
-}
-
void BKE_lamp_make_local(Main *bmain, Lamp *la)
{
bool is_local = false, is_lib = false;
@@ -205,7 +190,7 @@ void BKE_lamp_make_local(Main *bmain, Lamp *la)
if (is_local) {
if (!is_lib) {
id_clear_lib_data(bmain, &la->id);
- extern_local_lamp(la);
+ BKE_id_expand_local(&la->id, false);
}
else {
Lamp *la_new = BKE_lamp_copy(bmain, la);
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index 88b0418938f..7ffec1e70d9 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -286,6 +286,7 @@ Lattice *BKE_lattice_copy(Main *bmain, Lattice *lt)
if (lt->key) {
ltn->key = BKE_key_copy(bmain, ltn->key);
+ ltn->key->id.us = 0; /* Will be increased again by BKE_id_expand_local. */
ltn->key->from = (ID *)ltn;
}
@@ -297,6 +298,8 @@ Lattice *BKE_lattice_copy(Main *bmain, Lattice *lt)
ltn->editlatt = NULL;
+ BKE_id_expand_local(&ltn->id, true);
+
if (ID_IS_LINKED_DATABLOCK(lt)) {
BKE_id_lib_local_paths(bmain, lt->id.lib, &ltn->id);
}
@@ -350,7 +353,7 @@ void BKE_lattice_make_local(Main *bmain, Lattice *lt)
if (lt->key) {
BKE_key_make_local(bmain, lt->key);
}
- /* No extern_local_lattice... */
+ BKE_id_expand_local(&lt->id, false);
}
else {
Lattice *lt_new = BKE_lattice_copy(bmain, lt);
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c
index 0a29b2d53fd..e615c229a13 100644
--- a/source/blender/blenkernel/intern/mball.c
+++ b/source/blender/blenkernel/intern/mball.c
@@ -105,20 +105,18 @@ MetaBall *BKE_mball_add(Main *bmain, const char *name)
MetaBall *BKE_mball_copy(Main *bmain, MetaBall *mb)
{
MetaBall *mbn;
- int a;
mbn = BKE_libblock_copy(bmain, &mb->id);
BLI_duplicatelist(&mbn->elems, &mb->elems);
mbn->mat = MEM_dupallocN(mb->mat);
- for (a = 0; a < mbn->totcol; a++) {
- id_us_plus((ID *)mbn->mat[a]);
- }
mbn->editelems = NULL;
mbn->lastelem = NULL;
+ BKE_id_expand_local(&mbn->id, true);
+
if (ID_IS_LINKED_DATABLOCK(mb)) {
BKE_id_lib_local_paths(bmain, mb->id.lib, &mbn->id);
}
@@ -126,21 +124,6 @@ MetaBall *BKE_mball_copy(Main *bmain, MetaBall *mb)
return mbn;
}
-static int extern_local_mball_callback(
- void *UNUSED(user_data), struct ID *UNUSED(id_self), struct ID **id_pointer, int cd_flag)
-{
- /* We only tag usercounted ID usages as extern... Why? */
- if ((cd_flag & IDWALK_USER) && *id_pointer) {
- id_lib_extern(*id_pointer);
- }
- return IDWALK_RET_NOP;
-}
-
-static void extern_local_mball(MetaBall *mb)
-{
- BKE_library_foreach_ID_link(&mb->id, extern_local_mball_callback, NULL, 0);
-}
-
void BKE_mball_make_local(Main *bmain, MetaBall *mb)
{
bool is_local = false, is_lib = false;
@@ -159,7 +142,7 @@ void BKE_mball_make_local(Main *bmain, MetaBall *mb)
if (is_local) {
if (!is_lib) {
id_clear_lib_data(bmain, &mb->id);
- extern_local_mball(mb);
+ BKE_id_expand_local(&mb->id, false);
}
else {
MetaBall *mb_new = BKE_mball_copy(bmain, mb);
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index e737696b3af..cfcc88e97b0 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -496,18 +496,11 @@ Mesh *BKE_mesh_add(Main *bmain, const char *name)
Mesh *BKE_mesh_copy(Main *bmain, Mesh *me)
{
Mesh *men;
- MTFace *tface;
- MTexPoly *txface;
- int a, i;
const int do_tessface = ((me->totface != 0) && (me->totpoly == 0)); /* only do tessface if we have no polys */
men = BKE_libblock_copy(bmain, &me->id);
men->mat = MEM_dupallocN(me->mat);
- for (a = 0; a < men->totcol; a++) {
- id_us_plus((ID *)men->mat[a]);
- }
- id_us_plus((ID *)men->texcomesh);
CustomData_copy(&me->vdata, &men->vdata, CD_MASK_MESH, CD_DUPLICATE, men->totvert);
CustomData_copy(&me->edata, &men->edata, CD_MASK_MESH, CD_DUPLICATE, men->totedge);
@@ -522,37 +515,19 @@ Mesh *BKE_mesh_copy(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);
-
+
if (me->key) {
men->key = BKE_key_copy(bmain, me->key);
+ men->id.us = 0; /* Will be increased again by BKE_id_expand_local. */
men->key->from = (ID *)men;
}
+ BKE_id_expand_local(&men->id, true);
+
if (ID_IS_LINKED_DATABLOCK(me)) {
BKE_id_lib_local_paths(bmain, me->id.lib, &men->id);
}
@@ -577,50 +552,6 @@ BMesh *BKE_mesh_to_bmesh(
return bm;
}
-static int extern_local_mesh_callback(
- void *UNUSED(user_data), struct ID *UNUSED(id_self), struct ID **id_pointer, int cd_flag)
-{
- /* We only tag usercounted ID usages as extern... Why? */
- if ((cd_flag & IDWALK_USER) && *id_pointer) {
- id_lib_extern(*id_pointer);
- }
- return IDWALK_RET_NOP;
-}
-
-static void expand_local_mesh(Mesh *me)
-{
- BKE_library_foreach_ID_link(&me->id, extern_local_mesh_callback, NULL, 0);
-
- /* special case: images assigned to UVLayers always made local immediately - why? */
- 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++) {
- 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++) {
- if (tface->tpage) {
- id_lib_extern((ID *)tface->tpage);
- }
- }
- }
- }
- }
-}
-
void BKE_mesh_make_local(Main *bmain, Mesh *me)
{
bool is_local = false, is_lib = false;
@@ -642,7 +573,7 @@ void BKE_mesh_make_local(Main *bmain, Mesh *me)
if (me->key) {
BKE_key_make_local(bmain, me->key);
}
- expand_local_mesh(me);
+ BKE_id_expand_local(&me->id, false);
}
else {
Mesh *me_new = BKE_mesh_copy(bmain, me);
diff --git a/source/blender/blenkernel/intern/speaker.c b/source/blender/blenkernel/intern/speaker.c
index e1bb0998145..7a9fee9e0ef 100644
--- a/source/blender/blenkernel/intern/speaker.c
+++ b/source/blender/blenkernel/intern/speaker.c
@@ -73,8 +73,8 @@ Speaker *BKE_speaker_copy(Main *bmain, Speaker *spk)
Speaker *spkn;
spkn = BKE_libblock_copy(bmain, &spk->id);
- if (spkn->sound)
- id_us_plus(&spkn->sound->id);
+
+ BKE_id_expand_local(&spkn->id, true);
if (ID_IS_LINKED_DATABLOCK(spk)) {
BKE_id_lib_local_paths(G.main, spk->id.lib, &spkn->id);
@@ -83,21 +83,6 @@ Speaker *BKE_speaker_copy(Main *bmain, Speaker *spk)
return spkn;
}
-static int extern_local_speaker_callback(
- void *UNUSED(user_data), struct ID *UNUSED(id_self), struct ID **id_pointer, int cd_flag)
-{
- /* We only tag usercounted ID usages as extern... Why? */
- if ((cd_flag & IDWALK_USER) && *id_pointer) {
- id_lib_extern(*id_pointer);
- }
- return IDWALK_RET_NOP;
-}
-
-static void extern_local_speaker(Speaker *spk)
-{
- BKE_library_foreach_ID_link(&spk->id, extern_local_speaker_callback, NULL, 0);
-}
-
void BKE_speaker_make_local(Main *bmain, Speaker *spk)
{
bool is_local = false, is_lib = false;
@@ -116,7 +101,7 @@ void BKE_speaker_make_local(Main *bmain, Speaker *spk)
if (is_local) {
if (!is_lib) {
id_clear_lib_data(bmain, &spk->id);
- extern_local_speaker(spk);
+ BKE_id_expand_local(&spk->id, false);
}
else {
Speaker *spk_new = BKE_speaker_copy(bmain, spk);