[Bf-blender-cvs] [cfec1ee] fracture_modifier: reordered functions and made them static in MOD_fracture.c, leaving out some unnecessary info for writing to blend in writefile.c (still have that read_struct memoryleak sometimes)

Martin Felke noreply at git.blender.org
Tue Oct 21 18:56:27 CEST 2014


Commit: cfec1eea63568bbd20e776be74d1adf0395bf4fd
Author: Martin Felke
Date:   Tue Oct 21 18:55:18 2014 +0200
Branches: fracture_modifier
https://developer.blender.org/rBcfec1eea63568bbd20e776be74d1adf0395bf4fd

reordered functions and made them static in MOD_fracture.c, leaving out some unnecessary info for writing to blend in writefile.c (still have that read_struct memoryleak sometimes)

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

M	source/blender/blenloader/intern/writefile.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 54292a7..7b8abde 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1497,8 +1497,6 @@ static void write_meshIsland(WriteData* wd, MeshIsland* mi)
 	mi->temp = BKE_custom_data_to_shard(mi->temp, dm);
 
 	writestruct(wd, DATA, "MeshIsland", 1, mi);
-	writedata(wd, DATA, sizeof(struct BMVert*) * mi->vertex_count, mi->vertices);
-	writedata(wd, DATA, sizeof(MVert*) * mi->vertex_count, mi->vertices_cached);
 	writedata(wd, DATA, sizeof(float) * 3 * mi->vertex_count, mi->vertco);
 	/* write derivedmesh as shard... */
 	mi->temp->next = NULL;
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 7e3e74a..6111612 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -78,12 +78,6 @@
 #include "../../bmesh/tools/bmesh_decimate.h" /* decimate_dissolve function */
 #include "depsgraph_private.h" /* for depgraph updates */
 
-static void fill_vgroup(FractureModifierData *rmd, DerivedMesh *dm, MDeformVert *dvert, Object *ob);
-static int getGroupObjects(Group *gr, Object ***obs, int g_exist);
-static void do_fracture(FractureModifierData *fracmd, ShardID id, Object *obj, DerivedMesh *dm);
-void freeMeshIsland(FractureModifierData *rmd, MeshIsland *mi, bool remove_rigidbody);
-DerivedMesh *doSimulate(FractureModifierData *fmd, Object *ob, DerivedMesh *dm, DerivedMesh *orig_dm);
-void refresh_customdata_image(Mesh *me, CustomData *pdata, int totface);
 
 static void initData(ModifierData *md)
 {
@@ -132,7 +126,64 @@ static void initData(ModifierData *md)
 	fmd->use_particle_birth_coordinates = true;
 }
 
-static void freeData(ModifierData *md)
+static void freeMeshIsland(FractureModifierData *rmd, MeshIsland *mi, bool remove_rigidbody)
+{
+
+	if (mi->physics_mesh) {
+		mi->physics_mesh->needsFree = 1;
+		mi->physics_mesh->release(mi->physics_mesh);
+		mi->physics_mesh = NULL;
+	}
+	if (mi->rigidbody) {
+		if (remove_rigidbody)
+			BKE_rigidbody_remove_shard(rmd->modifier.scene, mi);
+		MEM_freeN(mi->rigidbody);
+		mi->rigidbody = NULL;
+	}
+
+	{
+		if (mi->vertco) {
+			MEM_freeN(mi->vertco);
+			mi->vertco = NULL;
+		}
+
+		if (mi->vertno) {
+			MEM_freeN(mi->vertno);
+			mi->vertno = NULL;
+		}
+
+		if (mi->vertices) {
+			MEM_freeN(mi->vertices);
+			mi->vertices = NULL; /*borrowed only !!!*/
+		}
+	}
+
+	if (mi->vertices_cached) {
+		MEM_freeN(mi->vertices_cached);
+		mi->vertices_cached = NULL;
+	}
+
+	if (mi->bb != NULL) {
+		MEM_freeN(mi->bb);
+		mi->bb = NULL;
+	}
+
+	if (mi->participating_constraints != NULL) {
+		MEM_freeN(mi->participating_constraints);
+		mi->participating_constraints = NULL;
+		mi->participating_constraint_count = 0;
+	}
+
+	if (mi->vertex_indices) {
+		MEM_freeN(mi->vertex_indices);
+		mi->vertex_indices = NULL;
+	}
+
+	MEM_freeN(mi);
+	mi = NULL;
+}
+
+static void freeData_internal(ModifierData *md)
 {
 	FractureModifierData *rmd = (FractureModifierData *) md;
 	MeshIsland *mi;
@@ -280,6 +331,33 @@ static void freeData(ModifierData *md)
 	}
 }
 
+static void freeData(ModifierData *md)
+{
+	FractureModifierData *rmd = (FractureModifierData *) md;
+	MeshIsland *mi;
+
+	freeData_internal(md);
+
+	/*force deletion of meshshards here, it slips through improper state detection*/
+	/*here we know the modifier is about to be deleted completely*/
+	if (rmd->frac_mesh) {
+		BKE_fracmesh_free(rmd->frac_mesh, true);
+		MEM_freeN(rmd->frac_mesh);
+		rmd->frac_mesh = NULL;
+	}
+
+	while (rmd->meshIslands.first) {
+		mi = rmd->meshIslands.first;
+		BLI_remlink(&rmd->meshIslands, mi);
+		freeMeshIsland(rmd, mi, false);
+		mi = NULL;
+	}
+
+	rmd->meshIslands.first = NULL;
+	rmd->meshIslands.last = NULL;
+
+}
+
 static void doClusters(FractureModifierData *fmd)
 {
 	/*grow clusters from all shards */
@@ -383,6 +461,23 @@ static DerivedMesh *get_clean_dm(Object *ob, DerivedMesh *dm)
 	return dm;
 }
 
+static int getGroupObjects(Group *gr, Object ***obs, int g_exist)
+{
+	int ctr = g_exist;
+	GroupObject *go;
+	if (gr == NULL) return ctr;
+
+	for (go = gr->gobject.first; go; go = go->next) {
+
+		*obs = MEM_reallocN(*obs, sizeof(Object *) * (ctr + 1));
+		(*obs)[ctr] = go->ob;
+		ctr++;
+	}
+
+	return ctr;
+}
+
+
 static DerivedMesh *get_group_dm(FractureModifierData *fmd, DerivedMesh *dm)
 {
 	/* combine derived meshes from group objects into 1, trigger submodifiers if ob->derivedFinal is empty */
@@ -487,194 +582,6 @@ static DerivedMesh *get_group_dm(FractureModifierData *fmd, DerivedMesh *dm)
 	return dm;
 }
 
-
-static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
-                                  DerivedMesh *derivedData,
-                                  ModifierApplyFlag UNUSED(flag))
-{
-
-	FractureModifierData *fmd = (FractureModifierData *) md;
-	DerivedMesh *final_dm = derivedData;
-
-	DerivedMesh *group_dm = get_group_dm(fmd, derivedData);
-	DerivedMesh *clean_dm = get_clean_dm(ob, group_dm);
-
-	/* disable that automatically if sim is started, but must be re-enabled manually */
-	if (BKE_rigidbody_check_sim_running(md->scene->rigidbody_world, BKE_scene_frame_get(md->scene))) {
-		fmd->auto_execute = false;
-	}
-
-	if (fmd->auto_execute) {
-		fmd->refresh = true;
-	}
-
-	if (fmd->frac_mesh != NULL && fmd->frac_mesh->running == 1 && fmd->execute_threaded) {
-		/* skip modifier execution when fracture job is running */
-		return final_dm;
-	}
-
-	if (fmd->refresh)
-	{
-		if (fmd->dm != NULL) {
-			fmd->dm->needsFree = 1;
-			fmd->dm->release(fmd->dm);
-			fmd->dm = NULL;
-		}
-
-		if (fmd->frac_mesh != NULL) {
-			BKE_fracmesh_free(fmd->frac_mesh, true);
-			MEM_freeN(fmd->frac_mesh);
-			fmd->frac_mesh = NULL;
-		}
-
-		if (fmd->frac_mesh == NULL) {
-			fmd->frac_mesh = BKE_create_fracture_container();
-			if (fmd->execute_threaded)
-			{
-				fmd->frac_mesh->running = 1;
-			}
-		}
-	}
-
-	{
-		if (fmd->refresh) {
-			/* build normaltree from origdm */
-			if (fmd->nor_tree != NULL) {
-				BLI_kdtree_free(fmd->nor_tree);
-				fmd->nor_tree = NULL;
-			}
-
-			fmd->nor_tree = build_nor_tree(clean_dm);
-			if (fmd->face_pairs != NULL) {
-				BLI_ghash_free(fmd->face_pairs, NULL, NULL);
-				fmd->face_pairs = NULL;
-			}
-
-			fmd->face_pairs = BLI_ghash_int_new("face_pairs");
-
-			do_fracture(fmd, -1, ob, clean_dm);
-
-			if (!fmd->refresh) { /* might have been changed from outside, job cancel*/
-				return derivedData;
-			}
-		}
-		if (fmd->dm && fmd->frac_mesh && (fmd->dm->getNumPolys(fmd->dm) > 0) && (fmd->dm_group == NULL)) {
-			final_dm = doSimulate(fmd, ob, fmd->dm, clean_dm);
-		}
-		else {
-			final_dm = doSimulate(fmd, ob, clean_dm, clean_dm);
-		}
-	}
-
-	/* free newly created derivedmeshes only, but keep derivedData and final_dm*/
-	if ((clean_dm != group_dm) && (clean_dm != derivedData) && (clean_dm != final_dm))
-	{
-		clean_dm->needsFree = 1;
-		clean_dm->release(clean_dm);
-	}
-
-	if ((group_dm != derivedData) && (group_dm != final_dm))
-	{
-		group_dm->needsFree = 1;
-		group_dm->release(group_dm);
-	}
-
-	return final_dm;
-}
-
-static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
-                                    struct BMEditMesh *UNUSED(editData),
-                                    DerivedMesh *derivedData,
-                                    ModifierApplyFlag UNUSED(flag))
-{
-	FractureModifierData *fmd = (FractureModifierData *) md;
-	DerivedMesh *final_dm = derivedData;
-
-	DerivedMesh *group_dm = get_group_dm(fmd, derivedData);
-	DerivedMesh *clean_dm = get_clean_dm(ob, group_dm);
-
-	if (BKE_rigidbody_check_sim_running(md->scene->rigidbody_world, BKE_scene_frame_get(md->scene))) {
-		fmd->auto_execute = false;
-	}
-
-	if (fmd->auto_execute) {
-		fmd->refresh = true;
-	}
-
-	if (fmd->frac_mesh != NULL && fmd->frac_mesh->running == 1 && fmd->execute_threaded)
-	{
-		/* skip modifier execution when fracture job is running */
-		return final_dm;
-	}
-
-	if (fmd->refresh) {
-		if (fmd->dm != NULL) {
-			fmd->dm->needsFree = 1;
-			fmd->dm->release(fmd->dm);
-			fmd->dm = NULL;
-		}
-
-		if (fmd->frac_mesh != NULL) {
-			BKE_fracmesh_free(fmd->frac_mesh, true /*fmd->frac_algorithm != MOD_FRACTURE_VORONOI*/);
-			MEM_freeN(fmd->frac_mesh);
-			fmd->frac_mesh = NULL;
-		}
-
-		if (fmd->frac_mesh == NULL) {
-			fmd->frac_mesh = BKE_create_fracture_container();
-			if (fmd->execute_threaded) {
-				fmd->frac_mesh->running = 1;
-			}
-		}
-	}
-
-	{
-		if (fmd->refresh) {
-			/* build normaltree from origdm */
-			if (fmd->nor_tree != NULL) {
-				BLI_kdtree_free(fmd->nor_tree);
-				fmd->nor_tree = NULL;
-			}
-
-			fmd->nor_tree = build_nor_tree(clean_dm);
-			if (fmd->face_pairs != NULL) {
-				BLI_ghash_free(fmd->face_pairs, NULL, NULL);
-				fmd->face_pairs = NULL;
-			}
-
-			fmd->face_pairs = BLI_ghash_int_new("face_pairs");
-
-			do_fracture(fmd, -1, ob, clean_dm);
-
-			if (!fmd->refresh) { /*might have been changed from outside, job cancel*/
-				return derivedData;
-			}
-		}
-
-		if (fmd->dm && fmd->frac_mesh && (fmd->dm->getNumPolys(fmd->dm) > 0) && (fmd->dm_group == NULL)) {
-			final_dm = doSimulate(fmd, ob, fmd->dm, clean_dm);
-		}
-		else {
-			final_dm = doSimulate(fmd, ob, clean_dm, clean_dm);
-		}
-	}
-
-	/* free newly created derivedmeshes only, but keep derivedData and final_dm*/
-	if ((clean_dm != group_dm) && (clean_dm != derivedData) && (clean_dm != final_dm))
-	{
-		clean_dm->needsFree = 1;
-		clean_dm->release(clean_dm);
-	}
-
-	if ((group_dm != derivedData) && (group_dm != final_dm))
-	{
-		group_dm->needsFree = 1;
-		group_dm->release(group_dm);
-	}
-
-	return final_dm;
-}
-
 static void points_from_verts(Object **ob, int totobj, FracPointCloud *points, float mat[4][4], float thresh, FractureModifierData *emd, DerivedMesh *dm, Object *obj)
 {
 	int v, o, pt = points->totpoints;
@@ -803,35 +710,19 @@ static void points_from_greasepencil(Object **ob, int totobj, FracPointCloud *po
 								point[1] = gps->points[p].y;
 								point[2] = gps->points[p].z;
 
-								mul_m4_v3(imat, point);
-
-								copy_v3_v3(points->points[pt].co, point);
-								pt++;
-							}
-						}


@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list