[Bf-blender-cvs] [8c70dd8] fracture_modifier: a bit clean up and attempt to reduce dynamic fracture memory leaks

Martin Felke noreply at git.blender.org
Wed Mar 30 23:10:16 CEST 2016


Commit: 8c70dd87c62c8b970136b32e828ce7a18609bb84
Author: Martin Felke
Date:   Wed Mar 30 23:09:52 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rB8c70dd87c62c8b970136b32e828ce7a18609bb84

a bit clean up and attempt to reduce dynamic fracture memory leaks

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

M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index ad3dabc..dad0d08 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1211,8 +1211,6 @@ void BKE_rigidbody_validate_sim_shard(RigidBodyWorld *rbw, MeshIsland *mi, Objec
 //	mi->start_frame = rbw->pointcache->startframe;
 //	mi->frame_count = 0;
 
-
-
 	fmd = (FractureModifierData*) modifiers_findByType(ob, eModifierType_Fracture);
 
 	/* make sure collision shape exists */
@@ -1245,7 +1243,15 @@ void BKE_rigidbody_validate_sim_shard(RigidBodyWorld *rbw, MeshIsland *mi, Objec
 		}
 #endif
 
-		DM_mesh_boundbox(ob->derivedFinal, locbb, size);
+		if (ob->derivedFinal)
+		{
+			DM_mesh_boundbox(ob->derivedFinal, locbb, size);
+		}
+		else
+		{
+			BKE_mesh_boundbox_calc((Mesh*)ob->data, locbb, size);
+		}
+
 		mul_v3_v3(size, ob->size);
 		rbo->physics_object = RB_body_new(rbo->physics_shape, loc, rot, fmd->use_compounds, fmd->impulse_dampening,
 		                                  fmd->directional_factor, fmd->minimum_impulse, fmd->mass_threshold_factor, size);
@@ -1983,7 +1989,7 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
 		ob_index2 = -1;
 	}
 
-	if (!ob1 || !ob2)
+	if ((!ob1 && ob_index1 == -1) || (!ob2 && ob_index2 == -1))
 		return false;
 
 	if ((mi1 != NULL) && (mi2 != NULL) && ob_index1 != -1 && ob_index2 != -1) {
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 122308b..7292d33 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -281,60 +281,11 @@ static void free_simulation(FractureModifierData *fmd, bool do_free_seq, bool do
 			msq = fmd->meshIsland_sequence.first;
 			if (msq)
 			{
-				//MeshIsland *mi;
-				//RigidBodyWorld *rbw = fmd->modifier.scene->rigidbody_world;
 				msq->is_new = true;
 				fmd->current_mi_entry = msq;
 				fmd->meshIslands = msq->meshIslands;
 				fmd->visible_mesh_cached = msq->visible_dm;
-#if 0
-				//re-init mi->verts, to be sure
-				for (mi = fmd->meshIslands.first; mi; mi = mi->next)
-				{
-					int i, start = 1, end = 250;
-					MVert *mv = fmd->visible_mesh_cached->getVertArray(fmd->visible_mesh_cached);
-					for (i = 0; i < mi->vertex_count; i++)
-					{
-						float loc[3];
-						short no[3];
-
-						loc[0] = mi->vertco[3*i];
-						loc[1] = mi->vertco[3*i+1];
-						loc[2] = mi->vertco[3*i+2];
-
-						no[0] = mi->vertno[3*i];
-						no[1] = mi->vertno[3*i+1];
-						no[2] = mi->vertno[3*i+2];
-
-						mi->vertices_cached[i] = mv + mi->vertex_indices[i];
-						copy_v3_v3(mi->vertices_cached[i]->co, loc);
-						copy_v3_v3_short(mi->vertices_cached[i]->no, no);
-
-					}
-					zero_v3(mi->rigidbody->lin_vel);
-					zero_v3(mi->rigidbody->ang_vel);
-
-					MEM_freeN(mi->locs);
-					MEM_freeN(mi->rots);
-
-					if (rbw && rbw->pointcache)
-					{
-						start = rbw->pointcache->startframe;
-						end = rbw->pointcache->endframe;
-					}
-
-					fmd->current_mi_entry->frame = end;
-
-					mi->frame_count = end - start + 1;
-					mi->start_frame = start;
-					mi->locs = MEM_mallocN(sizeof(float)*3* mi->frame_count, "mi->locs");
-					mi->rots = MEM_mallocN(sizeof(float)*4* mi->frame_count, "mi->rots");
 
-					BKE_rigidbody_remove_shard(fmd->modifier.scene, mi);
-				}
-#endif
-
-				//BKE_rigidbody_update_ob_array(rbw);
 			}
 			else
 			{
@@ -393,7 +344,7 @@ static void free_simulation(FractureModifierData *fmd, bool do_free_seq, bool do
 			while (fmd->meshIsland_sequence.first) {
 				msq = fmd->meshIsland_sequence.first;
 				BLI_remlink(&fmd->meshIsland_sequence, msq);
-				free_meshislands(fmd, &msq->meshIslands, do_free_rigidbody);
+				free_meshislands(fmd, &msq->meshIslands, do_free_rigidbody && (msq == fmd->current_mi_entry));
 				MEM_freeN(msq);
 				msq = NULL;
 			}
@@ -461,14 +412,16 @@ static void free_shards(FractureModifierData *fmd)
 
 static void free_modifier(FractureModifierData *fmd, bool do_free_seq)
 {
-	if (fmd->fracture_mode != MOD_FRACTURE_DYNAMIC)
+	/*if (fmd->fracture_mode != MOD_FRACTURE_DYNAMIC)
 	{
 		free_simulation(fmd, false, false);
 	}
 	else if (!do_free_seq)
 	{
 		free_simulation(fmd, true, true);
-	}
+	}*/
+
+	free_simulation(fmd, do_free_seq, fmd->fracture_mode == MOD_FRACTURE_DYNAMIC);
 
 	if (fmd->material_index_map)
 	{
@@ -518,12 +471,6 @@ static void free_modifier(FractureModifierData *fmd, bool do_free_seq)
 		if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL)
 			free_shards(fmd);
 	}
-#if 0
-	else
-	{
-		free_shards(fmd);
-	}
-#endif
 
 	if (fmd->vert_index_map != NULL) {
 		BLI_ghash_free(fmd->vert_index_map, NULL, NULL);
@@ -2081,6 +2028,7 @@ static void handle_vert(FractureModifierData *fmd, DerivedMesh *dm, BMVert* vert
 	*startno = MEM_reallocN(*startno, ((*tag_counter) + 1) * 3 * sizeof(short));
 
 	normal_float_to_short_v3(vno, vert->no);
+	normal_float_to_short_v3(no, vert->no);
 	if (fmd->fix_normals)
 		find_normal(dm, fmd->nor_tree, vert->co, vno, no, fmd->nor_range);
 	(*startno)[3 * (*tag_counter)] = no[0];
@@ -3612,7 +3560,7 @@ static void do_refresh(FractureModifierData *fmd, Object *ob, DerivedMesh* dm, D
 
 	copy_m4_m4(fmd->origmat, ob->obmat);
 
-	//if (fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED)
+	//if (fmd->fracture_mode != MOD_FRACTURE_DYNAMIC)
 	{
 		/* refracture, convert the fracture shards to new meshislands here *
 		 * shards = fracture datastructure
@@ -3633,7 +3581,7 @@ static void do_refresh(FractureModifierData *fmd, Object *ob, DerivedMesh* dm, D
 
 			fill_vgroup(fmd, fmd->visible_mesh_cached, ivert, ob);
 		}
-		else {
+		else if (fmd->fracture_mode != MOD_FRACTURE_DYNAMIC){
 			if (fmd->visible_mesh != NULL) {
 				BM_mesh_free(fmd->visible_mesh);
 				fmd->visible_mesh = NULL;
@@ -3803,8 +3751,7 @@ static void updateDepgraph(ModifierData *md, DagForest *forest,
 
 static void foreachObjectLink(
     ModifierData *md, Object *ob,
-    void (*walk)(void *userData, Object *ob, Object **obpoin),
-    void *userData)
+    ObjectWalkFunc walk, void *userData)
 {
 	FractureModifierData *fmd = (FractureModifierData *) md;
 
@@ -3812,7 +3759,7 @@ static void foreachObjectLink(
 		GroupObject *go;
 		for (go = fmd->extra_group->gobject.first; go; go = go->next) {
 			if (go->ob) {
-				walk(userData, ob, &go->ob);
+				walk(userData, ob, &go->ob, IDWALK_NOP);
 			}
 		}
 	}
@@ -3821,18 +3768,16 @@ static void foreachObjectLink(
 		GroupObject *go;
 		for (go = fmd->cutter_group->gobject.first; go; go = go->next) {
 			if (go->ob) {
-				walk(userData, ob, &go->ob);
+				walk(userData, ob, &go->ob, IDWALK_NOP);
 			}
 		}
 	}
 
-	//TODO, walking over fracture settings, too ?
-
 	if (fmd->autohide_filter_group) {
 		GroupObject *go;
 		for (go = fmd->autohide_filter_group->gobject.first; go; go = go->next) {
 			if (go->ob) {
-				walk(userData, ob, &go->ob);
+				walk(userData, ob, &go->ob, IDWALK_NOP);
 			}
 		}
 	}
@@ -3860,7 +3805,6 @@ static ShardSequence* shard_sequence_add(FractureModifierData* fmd, float frame,
 		fmd->shards_to_islands = false;
 		BKE_fracture_create_dm(fmd, true);
 		fmd->shards_to_islands = temp;
-		//ssq->is_new = true;
 
 		ssq->frac_mesh = fmd->frac_mesh;
 	}
@@ -3879,7 +3823,6 @@ static MeshIslandSequence* meshisland_sequence_add(FractureModifierData* fmd, fl
 {
 	MeshIslandSequence *msq = MEM_mallocN(sizeof(MeshIslandSequence), "meshisland_sequence_add");
 	msq->frame = frame;
-	//msq->is_new = true;
 
 	if (BLI_listbase_is_empty(&fmd->meshIslands)) {
 		msq->meshIslands.first = NULL;
@@ -3906,7 +3849,7 @@ static MeshIslandSequence* meshisland_sequence_add(FractureModifierData* fmd, fl
 static void add_new_entries(FractureModifierData* fmd, DerivedMesh *dm, Object* ob)
 {
 	int frame = (int)BKE_scene_frame_get(fmd->modifier.scene);
-	int end = 250;
+	int end = 250; //TODO might be problematic with longer sequences, take proper end value ?
 
 	if (fmd->modifier.scene->rigidbody_world)
 	{
@@ -3929,171 +3872,6 @@ static void add_new_entries(FractureModifierData* fmd, DerivedMesh *dm, Object*
 	fmd->meshIslands = fmd->current_mi_entry->meshIslands;
 }
 
-#if 0
-static void check_shard_vertexgroup(ListBase *lb, Shard*s, int index)
-{
-	//check first vertex's group...
-	MDeformVert *dvert = CustomData_get(&s->vertData, 0, CD_MDEFORMVERT);
-	if (dvert)
-	{
-		if (defvert_find_index(dvert, index))
-		{
-			FractureID* fid = MEM_mallocN(sizeof(FractureID), "setting_fracture_id");
-			fid->shardID = s->shard_id;
-			BLI_addtail(lb, fid);
-		}
-	}
-}
-
-static void fracture_per_setting(FractureModifierData* fmd, Object* ob, DerivedMesh* dm, int index)
-{
-	//make an shard ID list per setting
-	ListBase lb;
-	Shard *s;
-	FractureID *fid;
-
-	lb.first = NULL;
-	lb.last = NULL;
-
-	for (s = fmd->frac_mesh->shard_map.first; s; s = s->next)
-	{
-		check_shard_vertexgroup(&lb, s, index);
-	}
-
-/*	for (s = fmd->islandShards.first; s; s = s->next)
-	{
-		check_shard_vertexgroup(&lb, s, index);
-	}*/
-
-	//now fracture all found shards
-	while (lb.first)
-	{
-		fid = lb.first;
-		do_fracture(fmd, fid->shardID, ob, dm);
-		BLI_remlink(&lb, fid);
-		MEM_freeN(fid);
-	}
-}
-
-static FractureSetting* create_default_setting(bDeformGroup *vgroup)
-{
-	FractureSetting *fs = MEM_callocN(sizeof(FractureSetting), "default_fracture_setting");
-
-	strncpy(fs->name, vgroup->name, strlen(vgroup->name));
-
-	fs->cluster_count = 0;
-	fs->extra_group = NULL;
-	fs->frac_algorithm = MOD_FRACTURE_BOOLEAN;
-	fs->point_source = MOD_FRACTURE_UNIFORM;
-	fs->shard_count = 10;
-	fs->percentage = 100;
-
-	fs->breaking_threshold = 10.0f;
-	fs->use_constraints = false;
-	fs->contact_dist = 1.0f;
-	fs->use_mass_dependent_thresholds = false;
-
-	fs->constraint_limit = 50;
-	fs->breaking_distance = 0;
-	fs->breaking_angle = 0;
-	fs->breaking_percentage = 0;     /* disable by default*/
-
-	fs->cluster_breaking_threshold = 1000.0f;
-	fs->solver_iterations_override = 0;
-	fs->cluster_solver_iterations_override = 0;
-	fs->shards_to_islands = false;
-	fs->fix_normals = false;
-
-	fs->breaking_percentage_weighted = false;
-	fs->breaking_angle_weighted = false;
-	fs->breaking_distance_weighted = false;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list