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:
-rw-r--r--source/blender/blenkernel/BKE_key.h3
-rw-r--r--source/blender/blenkernel/intern/curve.c14
-rw-r--r--source/blender/blenkernel/intern/key.c23
-rw-r--r--source/blender/blenkernel/intern/lattice.c14
-rw-r--r--source/blender/blenkernel/intern/library.c2
-rw-r--r--source/blender/blenkernel/intern/mesh.c10
-rw-r--r--source/gameengine/Converter/BL_ShapeDeformer.cpp6
7 files changed, 42 insertions, 30 deletions
diff --git a/source/blender/blenkernel/BKE_key.h b/source/blender/blenkernel/BKE_key.h
index 1edbb455ca4..a278fd54f9b 100644
--- a/source/blender/blenkernel/BKE_key.h
+++ b/source/blender/blenkernel/BKE_key.h
@@ -39,6 +39,7 @@ struct ListBase;
struct Curve;
struct Object;
struct Lattice;
+struct Main;
struct Mesh;
struct WeightsArrayCache;
@@ -52,7 +53,7 @@ void BKE_key_free_nolib(struct Key *key);
struct Key *BKE_key_add(struct ID *id);
struct Key *BKE_key_copy(struct Key *key);
struct Key *BKE_key_copy_nolib(struct Key *key);
-void BKE_key_make_local(struct Key *key);
+void BKE_key_make_local(struct Main *bmain, struct Key *key);
void BKE_key_sort(struct Key *key);
void key_curve_position_weights(float t, float data[4], int type);
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 485099427e9..61c4b1b3368 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -191,8 +191,10 @@ Curve *BKE_curve_copy(Curve *cu)
cun->tb = MEM_dupallocN(cu->tb);
cun->bb = MEM_dupallocN(cu->bb);
- cun->key = BKE_key_copy(cu->key);
- if (cun->key) cun->key->from = (ID *)cun;
+ if (cu->key) {
+ cun->key = BKE_key_copy(cu->key);
+ cun->key->from = (ID *)cun;
+ }
cun->editnurb = NULL;
cun->editfont = NULL;
@@ -242,7 +244,9 @@ void BKE_curve_make_local(Curve *cu)
if (cu->id.us == 1) {
id_clear_lib_data(bmain, &cu->id);
- BKE_key_make_local(cu->key);
+ if (cu->key) {
+ BKE_key_make_local(bmain, cu->key);
+ }
extern_local_curve(cu);
return;
}
@@ -256,7 +260,9 @@ void BKE_curve_make_local(Curve *cu)
if (is_local && is_lib == false) {
id_clear_lib_data(bmain, &cu->id);
- BKE_key_make_local(cu->key);
+ if (cu->key) {
+ BKE_key_make_local(bamin, cu->key);
+ }
extern_local_curve(cu);
}
else if (is_local && is_lib) {
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c
index 79d42ed6e06..45686e9f450 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -58,6 +58,7 @@
#include "BKE_key.h"
#include "BKE_lattice.h"
#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_editmesh.h"
#include "BKE_scene.h"
@@ -154,8 +155,6 @@ Key *BKE_key_copy(Key *key)
Key *keyn;
KeyBlock *kbn, *kb;
- if (key == NULL) return NULL;
-
keyn = BKE_libblock_copy(&key->id);
BLI_duplicatelist(&keyn->block, &key->block);
@@ -184,9 +183,6 @@ Key *BKE_key_copy_nolib(Key *key)
Key *keyn;
KeyBlock *kbn, *kb;
- if (key == NULL)
- return NULL;
-
keyn = MEM_dupallocN(key);
keyn->adt = NULL;
@@ -207,17 +203,16 @@ Key *BKE_key_copy_nolib(Key *key)
return keyn;
}
-void BKE_key_make_local(Key *key)
+void BKE_key_make_local(Main *bmain, Key *key)
{
+ /* Note that here for now we simply just make it local...
+ * Sounds fishy behavior, but since skeys are not *real* IDs... */
- /* - only lib users: do nothing
- * - only local users: set flag
- * - mixed: make copy
- */
- if (key == NULL) return;
-
- key->id.lib = NULL;
- new_id(NULL, &key->id, NULL);
+ if (!ID_IS_LINKED_DATABLOCK(key)) {
+ return;
+ }
+
+ id_clear_lib_data(bmain, &key->id);
}
/* Sort shape keys and Ipo curves after a change. This assumes that at most
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index 53a3973f2c0..9bf417c6120 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -282,8 +282,10 @@ Lattice *BKE_lattice_copy(Lattice *lt)
ltn = BKE_libblock_copy(&lt->id);
ltn->def = MEM_dupallocN(lt->def);
- ltn->key = BKE_key_copy(ltn->key);
- if (ltn->key) ltn->key->from = (ID *)ltn;
+ if (lt->key) {
+ ltn->key = BKE_key_copy(ltn->key);
+ ltn->key->from = (ID *)ltn;
+ }
if (lt->dvert) {
int tot = lt->pntsu * lt->pntsv * lt->pntsw;
@@ -339,7 +341,9 @@ void BKE_lattice_make_local(Lattice *lt)
if (!ID_IS_LINKED_DATABLOCK(lt)) return;
if (lt->id.us == 1) {
id_clear_lib_data(bmain, &lt->id);
- BKE_key_make_local(lt->key);
+ if (lt->key) {
+ BKE_key_make_local(bmain, lt->key);
+ }
return;
}
@@ -352,7 +356,9 @@ void BKE_lattice_make_local(Lattice *lt)
if (is_local && is_lib == false) {
id_clear_lib_data(bmain, &lt->id);
- BKE_key_make_local(lt->key);
+ if (lt->key) {
+ BKE_key_make_local(bmain, lt->key);
+ }
}
else if (is_local && is_lib) {
Lattice *lt_new = BKE_lattice_copy(lt);
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index e83f462ed79..fbffe56a1e8 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -299,7 +299,7 @@ bool id_make_local(Main *bmain, ID *id, bool test)
case ID_IP:
return false; /* deprecated */
case ID_KE:
- if (!test) BKE_key_make_local((Key *)id);
+ if (!test) BKE_key_make_local(bmain, (Key *)id);
return true;
case ID_WO:
if (!test) BKE_world_make_local((World *)id);
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index f00e5123f35..82667484f1c 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -548,8 +548,10 @@ Mesh *BKE_mesh_copy_ex(Main *bmain, Mesh *me)
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->key) {
+ men->key = BKE_key_copy(me->key);
+ men->key->from = (ID *)men;
+ }
if (ID_IS_LINKED_DATABLOCK(me)) {
BKE_id_lib_local_paths(bmain, me->id.lib, &men->id);
@@ -642,7 +644,9 @@ void BKE_mesh_make_local(Main *bmain, Mesh *me)
if (is_local) {
if (!is_lib) {
id_clear_lib_data(bmain, &me->id);
- BKE_key_make_local(me->key);
+ if (me->key) {
+ BKE_key_make_local(bmain, me->key);
+ }
expand_local_mesh(me);
}
else {
diff --git a/source/gameengine/Converter/BL_ShapeDeformer.cpp b/source/gameengine/Converter/BL_ShapeDeformer.cpp
index 5e31dabfab1..ef9e9544c30 100644
--- a/source/gameengine/Converter/BL_ShapeDeformer.cpp
+++ b/source/gameengine/Converter/BL_ShapeDeformer.cpp
@@ -75,7 +75,7 @@ BL_ShapeDeformer::BL_ShapeDeformer(BL_DeformableGameObject *gameobj,
m_useShapeDrivers(false),
m_lastShapeUpdate(-1)
{
- m_key = BKE_key_copy(m_bmesh->key);
+ m_key = m_bmesh->key ? BKE_key_copy(m_bmesh->key) : NULL;
};
/* this second constructor is needed for making a mesh deformable on the fly. */
@@ -91,7 +91,7 @@ BL_ShapeDeformer::BL_ShapeDeformer(BL_DeformableGameObject *gameobj,
m_useShapeDrivers(false),
m_lastShapeUpdate(-1)
{
- m_key = BKE_key_copy(m_bmesh->key);
+ m_key = m_bmesh->key ? BKE_key_copy(m_bmesh->key) : NULL;
};
BL_ShapeDeformer::~BL_ShapeDeformer()
@@ -117,7 +117,7 @@ void BL_ShapeDeformer::ProcessReplica()
BL_SkinDeformer::ProcessReplica();
m_lastShapeUpdate = -1;
- m_key = BKE_key_copy(m_key);
+ m_key = m_key ? BKE_key_copy(m_key) : NULL;
}
bool BL_ShapeDeformer::LoadShapeDrivers(KX_GameObject* parent)