[Bf-blender-cvs] [921a86b] free-refcount-ids: Free IDs; lattice & camera.
Bastien Montagne
noreply at git.blender.org
Wed Sep 30 20:27:09 CEST 2015
Commit: 921a86b51f981a6131cfaf18d702ebf91402715f
Author: Bastien Montagne
Date: Sun Sep 27 15:50:28 2015 +0200
Branches: free-refcount-ids
https://developer.blender.org/rB921a86b51f981a6131cfaf18d702ebf91402715f
Free IDs; lattice & camera.
===================================================================
M source/blender/blenkernel/BKE_camera.h
M source/blender/blenkernel/BKE_key.h
M source/blender/blenkernel/BKE_lattice.h
M source/blender/blenkernel/intern/camera.c
M source/blender/blenkernel/intern/curve.c
M source/blender/blenkernel/intern/key.c
M source/blender/blenkernel/intern/lattice.c
M source/blender/blenkernel/intern/library.c
M source/blender/editors/mesh/editmesh_utils.c
M source/blender/editors/mesh/meshtools.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_camera.h b/source/blender/blenkernel/BKE_camera.h
index aacb7a4..84d5da8 100644
--- a/source/blender/blenkernel/BKE_camera.h
+++ b/source/blender/blenkernel/BKE_camera.h
@@ -53,7 +53,8 @@ struct GPUFXSettings;
void *BKE_camera_add(struct Main *bmain, const char *name);
struct Camera *BKE_camera_copy(struct Camera *cam);
void BKE_camera_make_local(struct Camera *cam);
-void BKE_camera_free(struct Camera *ca);
+void BKE_camera_release_datablocks(struct Camera *ca);
+void BKE_camera_free(struct Camera *ca, const bool do_id_user);
/* Camera Usage */
diff --git a/source/blender/blenkernel/BKE_key.h b/source/blender/blenkernel/BKE_key.h
index abe1228..dc9dee0 100644
--- a/source/blender/blenkernel/BKE_key.h
+++ b/source/blender/blenkernel/BKE_key.h
@@ -47,7 +47,8 @@ struct WeightsArrayCache;
extern "C" {
#endif
-void BKE_key_free(struct Key *sc);
+void BKE_key_release_datablocks(struct Key *key);
+void BKE_key_free(struct Key *sc, const bool do_id_user);
void BKE_key_free_nolib(struct Key *key);
struct Key *BKE_key_add(struct ID *id);
struct Key *BKE_key_copy(struct Key *key);
diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h
index 677d8e3..8f2f89f 100644
--- a/source/blender/blenkernel/BKE_lattice.h
+++ b/source/blender/blenkernel/BKE_lattice.h
@@ -47,7 +47,8 @@ struct MDeformVert;
void BKE_lattice_resize(struct Lattice *lt, int u, int v, int w, struct Object *ltOb);
struct Lattice *BKE_lattice_add(struct Main *bmain, const char *name);
struct Lattice *BKE_lattice_copy(struct Lattice *lt);
-void BKE_lattice_free(struct Lattice *lt);
+void BKE_lattice_release_datablocks(struct Lattice *lt);
+void BKE_lattice_free(struct Lattice *lt, const bool do_id_user);
void BKE_lattice_make_local(struct Lattice *lt);
void calc_lat_fudu(int flag, int res, float *r_fu, float *r_du);
diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c
index 7e043df..ba9ac48 100644
--- a/source/blender/blenkernel/intern/camera.c
+++ b/source/blender/blenkernel/intern/camera.c
@@ -144,8 +144,33 @@ void BKE_camera_make_local(Camera *cam)
}
}
-void BKE_camera_free(Camera *ca)
+/**
+ * Release all datablocks (ID) used by this camera (datablocks are never freed, they are just unreferenced).
+ *
+ * \param ca The camera which has to release its data.
+ */
+void BKE_camera_release_datablocks(Camera *ca)
{
+ if (ca == NULL)
+ return;
+
+ /* No ID refcount here... */
+ ca->dof_ob = NULL;
+}
+
+/**
+ * Free (or release) any data used by this camera (does not free the camera itself).
+ *
+ * \param ca The camera to free.
+ * \param do_id_user When \a true, ID datablocks used (referenced) by this camera are 'released'
+ * (their user count is decreased).
+ */
+void BKE_camera_free(Camera *ca, const bool do_id_user)
+{
+ if (do_id_user) {
+ BKE_camera_release_datablocks(ca);
+ }
+
BKE_animdata_free((ID *)ca);
}
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 4321142..c4961d2 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -72,7 +72,7 @@ static int cu_isectLL(const float v1[3], const float v2[3], const float v3[3], c
/**
* Release all datablocks (ID) used by this curve (datablocks are never freed, they are just unreferenced).
*
- * @param cu The curve which has to release its data.
+ * \param cu The curve which has to release its data.
*/
void BKE_curve_release_datablocks(Curve *cu)
{
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c
index b591dc1..8f45ec4 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -73,9 +73,32 @@
#define IPO_BEZTRIPLE 100
#define IPO_BPOINT 101
-void BKE_key_free(Key *key)
+
+/**
+ * Release all datablocks (ID) used by this shapekey (datablocks are never freed, they are just unreferenced).
+ *
+ * \param key The shapekey which has to release its data.
+ */
+void BKE_key_release_datablocks(Key *key)
+{
+ /* No ID refcount here... */
+ key->from = NULL;
+}
+
+/**
+ * Free (or release) any data used by this shapekey (does not free the key itself).
+ *
+ * \param key The shapekey to free.
+ * \param do_id_user When \a true, ID datablocks used (referenced) by this key are 'released'
+ * (their user count is decreased).
+ */
+void BKE_key_free(Key *key, const bool do_id_user)
{
KeyBlock *kb;
+
+ if (do_id_user) {
+ BKE_key_release_datablocks(key);
+ }
BKE_animdata_free((ID *)key);
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index 009e1d2..c9401a5 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -293,25 +293,57 @@ Lattice *BKE_lattice_copy(Lattice *lt)
return ltn;
}
-void BKE_lattice_free(Lattice *lt)
+/**
+ * Release all datablocks (ID) used by this lattice (datablocks are never freed, they are just unreferenced).
+ *
+ * \param lt The lattice which has to release its data.
+ */
+void BKE_lattice_release_datablocks(Lattice *lt)
+{
+ if (lt == NULL)
+ return;
+
+ if (lt->key) {
+ lt->key->id.us--;
+ lt->key = NULL;
+ }
+}
+
+/**
+ * Free (or release) any data used by this lattice (does not free the lattice itself).
+ *
+ * \param lt The lattice to free.
+ * \param do_id_user When \a true, ID datablocks used (referenced) by this lattice are 'released'
+ * (their user count is decreased).
+ */
+void BKE_lattice_free(Lattice *lt, const bool do_id_user)
{
- if (lt->def) MEM_freeN(lt->def);
- if (lt->dvert) BKE_defvert_array_free(lt->dvert, lt->pntsu * lt->pntsv * lt->pntsw);
+ if (do_id_user) {
+ BKE_lattice_release_datablocks(lt);
+ }
+
+ if (lt->def) {
+ MEM_freeN(lt->def);
+ lt->def = NULL;
+ }
+ if (lt->dvert) {
+ BKE_defvert_array_free(lt->dvert, lt->pntsu * lt->pntsv * lt->pntsw);
+ lt->dvert = NULL;
+ }
if (lt->editlatt) {
Lattice *editlt = lt->editlatt->latt;
- if (editlt->def) MEM_freeN(editlt->def);
- if (editlt->dvert) BKE_defvert_array_free(editlt->dvert, lt->pntsu * lt->pntsv * lt->pntsw);
+ if (editlt->def)
+ MEM_freeN(editlt->def);
+ if (editlt->dvert)
+ BKE_defvert_array_free(editlt->dvert, lt->pntsu * lt->pntsv * lt->pntsw);
MEM_freeN(editlt);
MEM_freeN(lt->editlatt);
+ lt->editlatt = NULL;
}
- /* free animation data */
- if (lt->adt) {
- BKE_animdata_free(<->id);
- lt->adt = NULL;
- }
+ BKE_animdata_free(<->id);
}
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 06aebae..71316f2 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -970,19 +970,19 @@ void BKE_libblock_free_ex(Main *bmain, void *idv, bool do_id_user)
BKE_image_free((Image *)id, do_id_user);
break;
case ID_LT:
- BKE_lattice_free((Lattice *)id);
+ BKE_lattice_free((Lattice *)id, do_id_user);
break;
case ID_LA:
BKE_lamp_free((Lamp *)id, do_id_user);
break;
case ID_CA:
- BKE_camera_free((Camera *) id);
+ BKE_camera_free((Camera *) id, do_id_user);
break;
- case ID_IP:
+ case ID_IP: /* Deprecated. */
BKE_ipo_free((Ipo *)id);
break;
case ID_KE:
- BKE_key_free((Key *)id);
+ BKE_key_free((Key *)id, do_id_user);
break;
case ID_WO:
BKE_world_free((World *)id);
diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c
index d521b2c..524e5c3 100644
--- a/source/blender/editors/mesh/editmesh_utils.c
+++ b/source/blender/editors/mesh/editmesh_utils.c
@@ -591,7 +591,7 @@ static void free_undo(void *me_v)
{
Mesh *me = me_v;
if (me->key) {
- BKE_key_free(me->key);
+ BKE_key_free(me->key, false);
MEM_freeN(me->key);
}
diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c
index 2491685..9525e88 100644
--- a/source/blender/editors/mesh/meshtools.c
+++ b/source/blender/editors/mesh/meshtools.c
@@ -552,7 +552,7 @@ int join_mesh_exec(bContext *C, wmOperator *op)
}
#endif
- BKE_key_free(nkey);
+ BKE_key_free(nkey, true);
BLI_remlink(&bmain->key, nkey);
MEM_freeN(nkey);
}
More information about the Bf-blender-cvs
mailing list