[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