[Bf-blender-cvs] [b85da31] fracture_modifier: fixes for dynamic and external mode, in external mode each simulation run should be consistent with the prior ones now

Martin Felke noreply at git.blender.org
Sat Jan 30 16:03:55 CET 2016


Commit: b85da312f0776a613e4855a1f40df151d65ffc14
Author: Martin Felke
Date:   Sat Jan 30 15:57:56 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rBb85da312f0776a613e4855a1f40df151d65ffc14

fixes for dynamic and external mode, in external mode each simulation run should be consistent with the prior ones now

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

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

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

diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index b0b3fbf..0a975ca 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -1659,7 +1659,7 @@ static DerivedMesh* do_create(FractureModifierData *fmd, int num_verts, int num_
 			s = (Shard *)fmd->frac_mesh->shard_map.first;
 		}
 
-		if (fmd->fracture_mode != MOD_FRACTURE_EXTERNAL)
+		if (fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED)
 		{
 			/*keep old behavior for now for older modes */
 			CustomData_merge(&s->vertData, &result->vertData, CD_MASK_MDEFORMVERT, CD_CALLOC, num_verts);
@@ -1833,29 +1833,35 @@ DerivedMesh *BKE_shard_create_dm(Shard *s, bool doCustomData)
 void BKE_get_next_entries(FractureModifierData *fmd)
 {
 	/*meshislands and shards SHOULD be synchronized !!!!*/
-	if (fmd->current_mi_entry->next != NULL) { // && fmd->current_mi_entry->next->is_new == false) {
-
+	if (fmd->current_mi_entry && fmd->current_mi_entry->next)
+	{ // && fmd->current_mi_entry->next->is_new == false) {
 		fmd->current_mi_entry = fmd->current_mi_entry->next;
-		fmd->current_shard_entry = fmd->current_shard_entry->next;
-
 		fmd->meshIslands = fmd->current_mi_entry->meshIslands;
-		fmd->frac_mesh = fmd->current_shard_entry->frac_mesh;
 		fmd->visible_mesh_cached = fmd->current_mi_entry->visible_dm;
 	}
+
+	if (fmd->current_shard_entry && fmd->current_shard_entry->next)
+	{
+		fmd->current_shard_entry = fmd->current_shard_entry->next;
+		fmd->frac_mesh = fmd->current_shard_entry->frac_mesh;
+	}
 }
 
 void BKE_get_prev_entries(FractureModifierData *fmd)
 {
 	/*meshislands and shards SHOULD be synchronized !!!!*/
-	if (fmd->current_mi_entry && fmd->current_mi_entry->prev) {
-
+	if (fmd->current_mi_entry && fmd->current_mi_entry->prev)
+	{
 		fmd->current_mi_entry = fmd->current_mi_entry->prev;
-		fmd->current_shard_entry = fmd->current_shard_entry->prev;
-
 		fmd->meshIslands = fmd->current_mi_entry->meshIslands;
-		fmd->frac_mesh = fmd->current_shard_entry->frac_mesh;
 		fmd->visible_mesh_cached = fmd->current_mi_entry->visible_dm;
 	}
+
+	if (fmd->current_shard_entry && fmd->current_shard_entry->prev)
+	{
+		fmd->current_shard_entry = fmd->current_shard_entry->prev;
+		fmd->frac_mesh = fmd->current_shard_entry->frac_mesh;
+	}
 }
 
 bool BKE_lookup_mesh_state(FractureModifierData *fmd, int frame, int do_lookup)
@@ -1866,14 +1872,14 @@ bool BKE_lookup_mesh_state(FractureModifierData *fmd, int frame, int do_lookup)
 
 	backward = ((fmd->last_frame > frame) && fmd->current_mi_entry && fmd->current_mi_entry->prev);
 	forward = ((fmd->last_frame < frame) && (fmd->current_mi_entry) && (fmd->current_mi_entry->next != NULL) &&
-	           (fmd->current_mi_entry->next->is_new == false));
+	           (fmd->current_mi_entry->is_new == false));
 
 	if (backward)
 	{
 		if (do_lookup)
 		{
 			while (fmd->current_mi_entry && fmd->current_mi_entry->prev &&
-				   frame < fmd->current_mi_entry->prev->frame)
+				   frame <= fmd->current_mi_entry->prev->frame)
 			{
 				printf("Jumping backward because %d is smaller than %d\n", frame, fmd->current_mi_entry->prev->frame);
 				changed = true;
@@ -1887,7 +1893,7 @@ bool BKE_lookup_mesh_state(FractureModifierData *fmd, int frame, int do_lookup)
 		if (do_lookup)
 		{
 			while ((fmd->current_mi_entry) && (fmd->current_mi_entry->next != NULL) &&
-				   (fmd->current_mi_entry->next->is_new == false) &&
+				   (fmd->current_mi_entry->is_new == false) &&
 				   frame > fmd->current_mi_entry->frame)
 			{
 				printf("Jumping forward because %d is greater than %d\n", frame, fmd->current_mi_entry->frame);
@@ -2530,8 +2536,7 @@ MeshIsland* BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* own,
 	//hrm need to rebuild ALL islands since vertex refs are bonkers now after mesh has changed
 	mi = fracture_shard_to_island(fmd, s, vertstart);
 
-	mat4_to_loc_quat(loc, rot, target->obmat);
-	copy_qt_qt(mi->rot, rot);
+	//mat4_to_loc_quat(loc, rot, target->obmat);
 
 	//lets see whether we need to add loc here too XXX TODO
 
@@ -2539,7 +2544,8 @@ MeshIsland* BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* own,
 	if (mi->rigidbody)
 	{
 		mi->rigidbody->meshisland_index = mi->id;
-		copy_qt_qt(mi->rigidbody->orn, rot);
+		copy_qt_qt(mi->rot, mi->rigidbody->orn);
+		copy_v3_v3(mi->centroid, mi->rigidbody->pos);
 	}
 
 	BLI_strncpy(mi->name, target->id.name + 2, MAX_ID_NAME - 2);
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index f141d7e..dbbebeb 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -1007,6 +1007,9 @@ static int  ptcache_rigidbody_write(int index, void *rb_v, void **data, int cfra
 	Object* ob = NULL;
 	FractureModifierData *fmd = NULL;
 
+	//if (!rbw->cache_index_map || !rbw->cache_offset_map)
+	//	return 1;
+
 	rbo = rbw->cache_index_map[index];
 	
 	if (rbo == NULL) {
@@ -1039,8 +1042,8 @@ static int  ptcache_rigidbody_write(int index, void *rb_v, void **data, int cfra
 			MeshIsland *mi = BLI_findlink(&fmd->meshIslands, rbo->meshisland_index);
 			int frame = (int)floor(cfra);
 
-			if (!mi)
-				return 0;
+//			if (!mi)
+//				return 0;
 
 			rbo = mi->rigidbody;
 
@@ -1052,6 +1055,8 @@ static int  ptcache_rigidbody_write(int index, void *rb_v, void **data, int cfra
 			frame =  frame - mi->start_frame;
 
 			//printf("Writing frame %d %d %d %d\n", (int)cfra, mi->start_frame, frame, fmd->last_frame);
+//			if (frame < 0) // GAAAAH!
+//				frame = 0;
 
 			mi->locs[3*frame] = rbo->pos[0];
 			mi->locs[3*frame+1] = rbo->pos[1];
@@ -1114,15 +1119,15 @@ static void ptcache_rigidbody_read(int index, void *rb_v, void **data, float cfr
 
 			mi = BLI_findlink(&fmd->meshIslands, rbo->meshisland_index);
 
-			if (!mi)
-				return;
+//			if (!mi)
+//				return;
 
 			frame = frame - mi->start_frame;
 
-			if (frame < 0)
-			{
-				frame = 0; //grrr, why does this happen ?!
-			}
+			//if (frame < 0)
+			//{
+			//	frame = 0; //grrr, why does this happen ?!
+			//}
 
 			//printf("Reading frame %d %d %d %d\n", (int)cfra, mi->start_frame, frame, fmd->last_frame);
 
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index cb6e6a5..936d430 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -78,7 +78,7 @@
 
 #ifdef WITH_BULLET
 
-static void resetDynamic(RigidBodyWorld *rbw);
+static void resetDynamic(RigidBodyWorld *rbw, bool do_reset_always);
 static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int rebuild, int transfer_speed);
 static void rigidbody_passive_fake_parenting(FractureModifierData *fmd, Object *ob, RigidBodyOb *rbo);
 static void rigidbody_passive_hook(FractureModifierData *fmd, MeshIsland *mi, Object* ob);
@@ -1395,13 +1395,13 @@ static void rigidbody_validate_sim_object(RigidBodyWorld *rbw, Object *ob, bool
 		{
 			if ((len_squared_v3(rbo->lin_vel) > (rbo->lin_sleep_thresh * rbo->lin_sleep_thresh)))
 			{
-				//printf("Setting linear velocity (%f, %f, %f)\n", rbo->lin_vel[0], rbo->lin_vel[1], rbo->lin_vel[2]);
+				printf("Setting linear velocity (%f, %f, %f)\n", rbo->lin_vel[0], rbo->lin_vel[1], rbo->lin_vel[2]);
 				RB_body_set_linear_velocity(rbo->physics_object, rbo->lin_vel);
 			}
 
 			if ((len_squared_v3(rbo->ang_vel) > (rbo->ang_sleep_thresh * rbo->ang_sleep_thresh)))
 			{
-				//printf("Setting angular velocity (%f, %f, %f)\n", rbo->ang_vel[0], rbo->ang_vel[1], rbo->ang_vel[2]);
+				printf("Setting angular velocity (%f, %f, %f)\n", rbo->ang_vel[0], rbo->ang_vel[1], rbo->ang_vel[2]);
 				RB_body_set_angular_velocity(rbo->physics_object, rbo->ang_vel);
 			}
 		}
@@ -1732,7 +1732,7 @@ static void rigidbody_create_shard_physics_constraint(FractureModifierData* fmd,
 						else
 						{
 							rbc->flag &= ~RBC_FLAG_PLASTIC_ACTIVE;
-							rigidbody_set_springs_active(rbc, false);
+							//rigidbody_set_springs_active(rbc, false);
 						}
 					}
 				}
@@ -1929,16 +1929,15 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
 	MeshIsland* mi1, *mi2;
 	RigidBodyWorld *rbw = (RigidBodyWorld*)world;
 	Object* ob1, *ob2;
-	int ob_index1, ob_index2;
+	int ob_index1 = -1, ob_index2 = -1;
 	bool validOb = true;
 
-	mi1 = (MeshIsland*)island1;
-	mi2 = (MeshIsland*)island2;
-
-#if 0
 	FractureModifierData *fmd1 = (FractureModifierData*)modifiers_findByType((Object*)blenderOb1, eModifierType_Fracture);
 	FractureModifierData *fmd2 = (FractureModifierData*)modifiers_findByType((Object*)blenderOb2, eModifierType_Fracture);
 
+	mi1 = (MeshIsland*)island1;
+	mi2 = (MeshIsland*)island2;
+
 	if ((fmd1 && fmd1->fracture_mode == MOD_FRACTURE_DYNAMIC) ||
 	   (fmd2 && fmd2->fracture_mode == MOD_FRACTURE_DYNAMIC))
 	{
@@ -1948,7 +1947,6 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
 		ob2 = blenderOb2;
 		return check_colgroup_ghost(ob1, ob2);
 	}
-#endif
 
 	if (rbw == NULL)
 	{
@@ -1959,7 +1957,7 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
 	}
 
 	/* cache offset map is a dull name for that... */
-	if (mi1 != NULL)
+	if (mi1 != NULL && rbw->cache_offset_map)
 	{
 		ob_index1 = rbw->cache_offset_map[mi1->linear_index];
 		ob1 = rbw->objects[ob_index1];
@@ -1967,9 +1965,10 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
 	else
 	{
 		ob1 = blenderOb1;
+		ob_index1 = -1;
 	}
 
-	if (mi2 != NULL)
+	if (mi2 != NULL && rbw->cache_offset_map)
 	{
 		ob_index2 = rbw->cache_offset_map[mi2->linear_index];
 		ob2 = rbw->objects[ob_index2];
@@ -1977,9 +1976,10 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
 	else
 	{
 		ob2 = blenderOb2;
+		ob_index2 = -1;
 	}
 
-	if ((mi1 != NULL) && (mi2 != NULL)) {
+	if ((mi1 != NULL) && (mi2 != NULL) && ob_index1 != -1 && ob_index2 != -1) {
 		validOb = (ob_index1 != ob_index2 && colgroup_check(ob1->rigidbody_object->col_groups, ob2->rigidbody_object->col_groups) &&
 				  ((mi1->rigidbody->flag & RBO_FLAG_KINEMATIC) || (mi2->rigidbody->flag & RBO_FLAG_KINEMATIC))

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list