[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(&lt->id);
-		lt->adt = NULL;
-	}
+	BKE_animdata_free(&lt->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