[Bf-blender-cvs] [099eb31] free-refcount-ids: ID free: GP & particles...

Bastien Montagne noreply at git.blender.org
Wed Sep 30 22:00:14 CEST 2015


Commit: 099eb3111e72762a0ef5d282d98855dbbdee29c5
Author: Bastien Montagne
Date:   Wed Sep 30 21:15:20 2015 +0200
Branches: free-refcount-ids
https://developer.blender.org/rB099eb3111e72762a0ef5d282d98855dbbdee29c5

ID free: GP & particles...

===================================================================

M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/blenkernel/BKE_particle.h
M	source/blender/blenkernel/intern/gpencil.c
M	source/blender/blenkernel/intern/library.c
M	source/blender/blenkernel/intern/particle.c
M	source/blender/editors/gpencil/gpencil_undo.c
M	source/blender/makesrna/intern/rna_main_api.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 084c552..2d28717 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -42,7 +42,7 @@ struct bGPDstroke;
 bool free_gpencil_strokes(struct bGPDframe *gpf);
 void free_gpencil_frames(struct bGPDlayer *gpl);
 void free_gpencil_layers(struct ListBase *list);
-void BKE_gpencil_free(struct bGPdata *gpd);
+void BKE_gpencil_free(struct bGPdata *gpd, const bool do_id_user);
 
 void gpencil_stroke_sync_selection(struct bGPDstroke *gps);
 
diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h
index 89cfb3a..83e589f 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -297,7 +297,8 @@ void psys_check_group_weights(struct ParticleSettings *part);
 int psys_uses_gravity(struct ParticleSimulationData *sim);
 
 /* free */
-void BKE_particlesettings_free(struct ParticleSettings *part);
+void BKE_particlesettings_release_datablocks(struct ParticleSettings *part);
+void BKE_particlesettings_free(struct ParticleSettings *part, const bool do_id_user);
 void psys_free_path_cache(struct ParticleSystem *psys, struct PTCacheEdit *edit);
 void psys_free(struct Object *ob, struct ParticleSystem *psys);
 
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index ee5c919..24c596c 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -112,16 +112,12 @@ void free_gpencil_layers(ListBase *list)
 }
 
 /* Free all of GPencil datablock's related data, but not the block itself */
-void BKE_gpencil_free(bGPdata *gpd)
+void BKE_gpencil_free(bGPdata *gpd, const bool UNUSED(do_id_user))
 {
 	/* free layers */
 	free_gpencil_layers(&gpd->layers);
 	
-	/* free animation data */
-	if (gpd->adt) {
-		BKE_animdata_free(&gpd->id);
-		gpd->adt = NULL;
-	}
+	BKE_animdata_free(&gpd->id);
 }
 
 /* -------- Container Creation ---------- */
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index db7aca2..c4a8f52 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -1021,14 +1021,14 @@ void BKE_libblock_free_ex(Main *bmain, void *idv, bool do_id_user)
 			BKE_brush_free((Brush *)id);
 			break;
 		case ID_PA:
-			BKE_particlesettings_free((ParticleSettings *)id);
+			BKE_particlesettings_free((ParticleSettings *)id, do_id_user);
 			break;
 		case ID_WM:
 			if (free_windowmanager_cb)
 				free_windowmanager_cb(NULL, (wmWindowManager *)id);
 			break;
 		case ID_GD:
-			BKE_gpencil_free((bGPdata *)id);
+			BKE_gpencil_free((bGPdata *)id, do_id_user);
 			break;
 		case ID_MC:
 			BKE_movieclip_free((MovieClip *)id);
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 9aacba8..c3c211a 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -371,10 +371,48 @@ static void fluid_free_settings(SPHFluidSettings *fluid)
 		MEM_freeN(fluid); 
 }
 
-void BKE_particlesettings_free(ParticleSettings *part)
+/**
+ * Release all datablocks (ID) used by this partsett (datablocks are never freed, they are just unreferenced).
+ *
+ * \param part The particle settings which has to release its data.
+ */
+void BKE_particlesettings_release_datablocks(ParticleSettings *part)
 {
 	MTex *mtex;
 	int a;
+
+	if (part == NULL)
+		return;
+
+	for (a = 0; a < MAX_MTEX; a++) {
+		mtex = part->mtex[a];
+		if (mtex && mtex->tex) {
+			mtex->tex->id.us--;
+			mtex->tex = NULL;
+		}
+	}
+
+	/* No ID refcount here... */
+	part->dup_group = NULL;
+	part->dup_ob = NULL;
+	part->bb_ob = NULL;
+}
+
+/**
+ * Free (or release) any data used by this particle settings (does not free the partsett itself).
+ *
+ * \param part The particle settings to free.
+ * \param do_id_user When \a true, ID datablocks used (referenced) by this partsett are 'released'
+ *                   (their user count is decreased).
+ */
+void BKE_particlesettings_free(ParticleSettings *part, const bool do_id_user)
+{
+	int a;
+
+	if (do_id_user) {
+		BKE_particlesettings_release_datablocks(part);
+	}
+
 	BKE_animdata_free(&part->id);
 	
 	if (part->clumpcurve)
@@ -385,8 +423,7 @@ void BKE_particlesettings_free(ParticleSettings *part)
 	free_partdeflect(part->pd);
 	free_partdeflect(part->pd2);
 
-	if (part->effector_weights)
-		MEM_freeN(part->effector_weights);
+	MEM_SAFE_FREE(part->effector_weights);
 
 	BLI_freelistN(&part->dupliweights);
 
@@ -394,9 +431,7 @@ void BKE_particlesettings_free(ParticleSettings *part)
 	fluid_free_settings(part->fluid);
 
 	for (a = 0; a < MAX_MTEX; a++) {
-		mtex = part->mtex[a];
-		if (mtex && mtex->tex) mtex->tex->id.us--;
-		if (mtex) MEM_freeN(mtex);
+		MEM_SAFE_FREE(part->mtex[a]);
 	}
 }
 
diff --git a/source/blender/editors/gpencil/gpencil_undo.c b/source/blender/editors/gpencil/gpencil_undo.c
index 34e640a..eaa0cd5 100644
--- a/source/blender/editors/gpencil/gpencil_undo.c
+++ b/source/blender/editors/gpencil/gpencil_undo.c
@@ -140,7 +140,7 @@ void gpencil_undo_push(bGPdata *gpd)
 			 */
 			undo_node->gpd->adt = NULL;
 			
-			BKE_gpencil_free(undo_node->gpd);
+			BKE_gpencil_free(undo_node->gpd, false);
 			MEM_freeN(undo_node->gpd);
 			
 			BLI_freelinkN(&undo_nodes, undo_node);
@@ -168,7 +168,7 @@ void gpencil_undo_finish(void)
 		 */
 		undo_node->gpd->adt = NULL;
 		
-		BKE_gpencil_free(undo_node->gpd);
+		BKE_gpencil_free(undo_node->gpd, false);
 		MEM_freeN(undo_node->gpd);
 		
 		undo_node = undo_node->next;
diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c
index b38f4fa..6e9f61a 100644
--- a/source/blender/makesrna/intern/rna_main_api.c
+++ b/source/blender/makesrna/intern/rna_main_api.c
@@ -718,7 +718,6 @@ static void rna_Main_grease_pencil_remove(Main *bmain, ReportList *reports, Poin
 {
 	bGPdata *gpd = gpd_ptr->data;
 	if (ID_REAL_USERS(gpd) <= 0) {
-		BKE_gpencil_free(gpd);
 		BKE_libblock_free(bmain, gpd);
 		RNA_POINTER_INVALIDATE(gpd_ptr);
 	}




More information about the Bf-blender-cvs mailing list