[Bf-blender-cvs] [ab326d29205] temp-fracture-modifier-2.8: improvement for dynamic fracture

Martin Felke noreply at git.blender.org
Tue Aug 21 22:31:26 CEST 2018


Commit: ab326d292056b32804da84f283655813382bcbae
Author: Martin Felke
Date:   Tue Aug 21 22:31:02 2018 +0200
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rBab326d292056b32804da84f283655813382bcbae

improvement for dynamic fracture

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

M	source/blender/blenkernel/BKE_fracture.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/fracture_dynamic.c
M	source/blender/blenkernel/intern/fracture_prefractured.c
M	source/blender/blenkernel/intern/fracture_rigidbody.c
M	source/blender/makesdna/DNA_fracture_types.h

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

diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index c7d68480ee2..950616e8d57 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -127,7 +127,7 @@ void BKE_fracture_constraint_create(struct Scene *scene, struct FractureModifier
 void BKE_fracture_split_islands(struct FractureModifierData *fmd, struct Object* ob, struct Mesh *me, struct Mesh ***temp_islands,
 int *count);
 
-struct Mesh* BKE_fracture_assemble_mesh_from_islands(struct FractureModifierData *fmd, struct ListBase *islands, struct Object *ob, float ctime);
+struct Mesh* BKE_fracture_assemble_mesh_from_islands(struct FractureModifierData *fmd, struct Scene* scene, struct Object *ob, float ctime);
 
 void BKE_fracture_modifier_free(struct FractureModifierData *fmd, struct Scene *scene);
 
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 54a0a35630d..539afde9a98 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -617,8 +617,8 @@ static void process_cells(FractureModifierData* fmd, MeshIsland* mi, Main* bmain
 				copy_v3_v3(result->rigidbody->pos, centr);
 				copy_qt_qt(result->rigidbody->orn, qrot);
 
-				//copy_v3_v3(result->centroid, centr);
-				//copy_qt_qt(result->rot, qrot);
+				copy_v3_v3(result->rigidbody->lin_vel, mi->rigidbody->lin_vel);
+				copy_v3_v3(result->rigidbody->ang_vel, mi->rigidbody->ang_vel);
 
 				//validate already here at once... dynamic somehow doesnt get updated else
 				BKE_rigidbody_shard_validate(scene->rigidbody_world, result, ob, fmd, true,
@@ -1340,7 +1340,7 @@ void fracture_copy_customdata(CustomData* src, CustomData* dst,CustomDataMask ma
 }
 
 
-Mesh* BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, ListBase *islands, Object* ob, float ctime)
+Mesh* BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, Scene *scene, Object* ob, float ctime)
 {
 	float imat[4][4];
 	MeshIsland *mi;
@@ -1355,11 +1355,15 @@ Mesh* BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, ListBas
 		    CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE |
 		    CD_MASK_CUSTOMLOOPNORMAL | CD_MASK_FACEMAP;
 
-	for (mi = islands->first; mi; mi = mi->next)
+	for (mi = fmd->shared->mesh_islands.first; mi; mi = mi->next)
 	{
 		RigidBodyOb *rbo = mi->rigidbody;
 
 		if (BKE_fracture_meshisland_check_frame(fmd, mi, (int)ctime)) {
+			if (scene && fmd->use_dynamic) {
+				/* remove rigidbody physics handles here too */
+				BKE_rigidbody_remove_shard(scene, mi);
+			}
  			continue;
 		}
 
@@ -1370,7 +1374,7 @@ Mesh* BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, ListBas
 	}
 
 	mesh = BKE_mesh_new_nomain(num_verts, num_edges, 0, num_loops, num_polys);
-	mi = islands->first;
+	mi = fmd->shared->mesh_islands.first;
 
 	if (fmd->shared->vert_index_map) {
 		BLI_ghash_free(fmd->shared->vert_index_map, NULL, NULL);
@@ -1380,7 +1384,7 @@ Mesh* BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, ListBas
 	fmd->shared->vert_index_map = BLI_ghash_int_new("vert_index_map");
 
 	invert_m4_m4(imat, ob->obmat);
-	for (mi = islands->first; mi; mi = mi->next)
+	for (mi = fmd->shared->mesh_islands.first; mi; mi = mi->next)
 	{
 		MVert *mv;
 		MPoly *mp;
@@ -2580,9 +2584,9 @@ FracPointCloud BKE_fracture_points_get(Depsgraph *depsgraph, FractureModifierDat
 		add_v3_v3v3(bmax, max, cent);
 		add_v3_v3v3(bmin, min, cent);
 
-#if 0
 		//first impact only, so shard has id 0
-		if (emd->fracture_mode == MOD_FRACTURE_DYNAMIC) {
+		if (emd->use_dynamic)
+		{
 			//shrink pointcloud container around impact point, to a size
 
 			copy_v3_v3(max, bmax);
@@ -2590,27 +2594,13 @@ FracPointCloud BKE_fracture_points_get(Depsgraph *depsgraph, FractureModifierDat
 
 			if (mi && mi->impact_size[0] > 0.0f && emd->limit_impact) {
 				float size[3], nmin[3], nmax[3], loc[3], tmin[3], tmax[3], rloc[3] = {0,0,0}, quat[4] = {1,0,0,0};
-				//MeshIslandSequence *msq = emd->shared->current_mi_entry->prev ? emd->shared->current_mi_entry->prev :
-				//                                                                emd->shared->current_mi_entry;
-				MeshIsland *mi = NULL;
-				RigidBodyOb *rbo = NULL;
+				RigidBodyOb *rbo = mi->rigidbody;
 
 				mat4_to_quat(quat, ob->obmat);
 				invert_qt(quat);
 
-				if (msq) {
-					if (mi->parent) {
-						//TODO; this should be the same meshisland later, it should be solved via pointer redirect
-						//mi = find_meshisland(&msq->meshIslands, mi->id);
-						mi = mi->parent; // ????? TODO FIX
-					}
-
-					if (mi) {
-						rbo = mi->rigidbody;
-						copy_v3_v3(rloc, rbo->pos);
-						mul_qt_qtqt(quat, rbo->orn, quat);
-					}
-				}
+				copy_v3_v3(rloc, rbo->pos);
+				mul_qt_qtqt(quat, rbo->orn, quat);
 
 				print_v3("Impact Loc\n", mi->impact_loc);
 				print_v3("Impact Size\n", mi->impact_size);
@@ -2664,7 +2654,6 @@ FracPointCloud BKE_fracture_points_get(Depsgraph *depsgraph, FractureModifierDat
 				print_v3("MAX:", max);*/
 			}
 		}
-#endif
 
 		//omg, vary the seed here
 		if (emd->split_islands) {
@@ -2672,7 +2661,7 @@ FracPointCloud BKE_fracture_points_get(Depsgraph *depsgraph, FractureModifierDat
 		}
 		else
 		{
-			BLI_thread_srandom(0, emd->point_seed);
+			BLI_thread_srandom(0, emd->use_dynamic ? mi->id : emd->point_seed);
 		}
 		for (i = 0; i < count; ++i) {
 			if (BLI_thread_frand(0) < thresh) {
diff --git a/source/blender/blenkernel/intern/fracture_dynamic.c b/source/blender/blenkernel/intern/fracture_dynamic.c
index 1060a47b4ca..6097f281735 100644
--- a/source/blender/blenkernel/intern/fracture_dynamic.c
+++ b/source/blender/blenkernel/intern/fracture_dynamic.c
@@ -59,7 +59,7 @@ void BKE_fracture_dynamic_do(FractureModifierData *fmd, Object* ob, Scene* scene
 
 		while(fid) {
 			FracPointCloud points;
-			if (!fid->fractured) {
+			if (!fid->mi->fractured) {
 				points = BKE_fracture_points_get(depsgraph, fmd, ob, fid->mi);
 				totpoint += points.totpoints;
 				MEM_freeN(points.points);
@@ -87,13 +87,14 @@ void BKE_fracture_dynamic_do(FractureModifierData *fmd, Object* ob, Scene* scene
 
 			fid = (FractureID*)fmd->shared->fracture_ids.first;
 			while(fid){
-				if (!fid->fractured) {
+				if (!fid->mi->fractured) {
 					BKE_fracture_do(fmd, fid->mi, ob, depsgraph, bmain, scene);
 				}
-				fid->fractured = true;
+				fid->mi->fractured = true;
 				count++;
 
-				fid = fid->next;
+				BLI_remlink(&fmd->shared->fracture_ids, fid);
+				fid = (FractureID*)fmd->shared->fracture_ids.first;
 			}
 
 #if 0
diff --git a/source/blender/blenkernel/intern/fracture_prefractured.c b/source/blender/blenkernel/intern/fracture_prefractured.c
index cccdb677cbc..eac66dfe7c4 100644
--- a/source/blender/blenkernel/intern/fracture_prefractured.c
+++ b/source/blender/blenkernel/intern/fracture_prefractured.c
@@ -177,7 +177,7 @@ Mesh* BKE_fracture_apply(FractureModifierData *fmd, Object *ob, Mesh *me_orig, D
 	/* assemble mesh from transformed meshislands */
 	if (fmd->shared->mesh_islands.first)
 	{
-		me_assembled = BKE_fracture_assemble_mesh_from_islands(fmd, &fmd->shared->mesh_islands, ob, ctime);
+		me_assembled = BKE_fracture_assemble_mesh_from_islands(fmd, scene, ob, ctime);
 		//DEG_id_tag_update(&ob->id, DEG_TAG_COPY_ON_WRITE);
 	}
 	else {
diff --git a/source/blender/blenkernel/intern/fracture_rigidbody.c b/source/blender/blenkernel/intern/fracture_rigidbody.c
index 19325bbef11..6c666fc6ff0 100644
--- a/source/blender/blenkernel/intern/fracture_rigidbody.c
+++ b/source/blender/blenkernel/intern/fracture_rigidbody.c
@@ -1612,12 +1612,10 @@ static void check_fracture_meshisland(FractureModifierData *fmd, MeshIsland *mi,
 
 		/*only fracture on new entries, this is necessary because after loading a file
 		 *the pointcache thinks it is empty and a fracture is attempted ! */
-		if (check_island_size(fmd, mi) /*&& (frame < mi->endframe && mi->endframe <= fmd->shared->last_cache_end)*/)
+		if (check_island_size(fmd, mi) && mi->fractured == false)
 		{
 			FractureID* fid = MEM_mallocN(sizeof(FractureID), "contact_callback_fractureid");
 			fid->mi = mi;
-			fid->fractured = false;
-			//fid->mi->endframe = frame;
 			BLI_addtail(&fmd->shared->fracture_ids, fid);
 			fmd->shared->refresh_dynamic = true;
 			printf("FRACTURE : %d\n", mi->id);
diff --git a/source/blender/makesdna/DNA_fracture_types.h b/source/blender/makesdna/DNA_fracture_types.h
index 2d3ca3f4719..05eb4a6baca 100644
--- a/source/blender/makesdna/DNA_fracture_types.h
+++ b/source/blender/makesdna/DNA_fracture_types.h
@@ -122,8 +122,6 @@ typedef struct MeshIslandSequence {
 typedef struct FractureID {
 	struct FractureID *next, *prev;
 	struct MeshIsland *mi;
-	char fractured;
-	char pad[7];
 } FractureID;
 
 typedef struct AnimBind {
@@ -219,6 +217,7 @@ typedef struct MeshIsland {
 	int object_index;
 	int totcol; /*store number of used materials here, from the original object*/
 	int totdef; /*store number of used vertexgroups here, from the original object*/
+	int fractured;
 
 	//formerly shard stuff
 	float min[3], max[3];
@@ -229,7 +228,7 @@ typedef struct MeshIsland {
 	float raw_volume;
 	float impact_loc[3]; /* last impact location on this shard */
 	float impact_size[3]; /* size of impact area (simplified) */
-	char pad[4];
+	//char pad[4];
 } MeshIsland;
 
 typedef struct SharedVertGroup {



More information about the Bf-blender-cvs mailing list