[Bf-blender-cvs] [3c54514] fracture_modifier: dynamic fracture should be bake and saveable now, but still has rotation glitches and glitches with change in mesh island sequence.

Martin Felke noreply at git.blender.org
Mon Nov 2 14:12:58 CET 2015


Commit: 3c545143544f6fd8429926ca364732009fb99552
Author: Martin Felke
Date:   Mon Nov 2 14:12:15 2015 +0100
Branches: fracture_modifier
https://developer.blender.org/rB3c545143544f6fd8429926ca364732009fb99552

dynamic fracture should be bake and saveable now, but still has rotation glitches and glitches with change in mesh island sequence.

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

M	source/blender/blenkernel/BKE_rigidbody.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/pointcache.c
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h
index 6fe4de1..13aec5e 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -100,6 +100,7 @@ float BKE_rigidbody_calc_min_con_dist(struct Object* ob);
 void BKE_rigidbody_start_dist_angle(struct RigidBodyShardCon* con);
 void BKE_rigidbody_remove_shard_con(struct Scene* scene, struct RigidBodyShardCon* con);
 void BKE_rigidbody_remove_shard(struct Scene* scene, struct MeshIsland *mi);
+void BKE_rigidbody_update_ob_array(struct RigidBodyWorld *rbw);
 /* -------------- */
 /* Utility Macros */
 
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 41389d5..f0fe7ab 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -1855,7 +1855,7 @@ bool BKE_lookup_mesh_state(FractureModifierData *fmd, int frame, int do_lookup)
 				   (fmd->current_mi_entry->next->is_new == false) &&
 				   frame > fmd->current_mi_entry->frame)
 			{
-				printf("Jumping forward because %d is greater/equal than %d\n", frame, fmd->current_mi_entry->frame);
+				printf("Jumping forward because %d is greater than %d\n", frame, fmd->current_mi_entry->frame);
 				changed = true;
 				BKE_free_constraints(fmd);
 				BKE_get_next_entries(fmd);
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index c0bc065..1e1b518 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -72,6 +72,7 @@
 #include "BKE_smoke.h"
 #include "BKE_softbody.h"
 #include "BKE_rigidbody.h"
+#include "BKE_fracture.h"
 
 #include "BIK_api.h"
 
@@ -1095,10 +1096,15 @@ static void ptcache_rigidbody_read(int index, void *rb_v, void **data, float cfr
 			//TODO, need to speed this up.... array, hash ?
 
 			//modifier should have "switched" this to current set of meshislands already.... so access it
-			MeshIsland *mi = BLI_findlink(&fmd->meshIslands, rbo->meshisland_index);
+			MeshIsland *mi = NULL;
 			int frame = (int)floor(cfra);
+
+			mi = BLI_findlink(&fmd->meshIslands, rbo->meshisland_index);
 			frame = frame - mi->start_frame;
 
+			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);
 
 			rbo->pos[0] = mi->locs[3*frame];
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 53b843b..f13ef0f 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -75,6 +75,7 @@
 
 #ifdef WITH_BULLET
 
+static void resetDynamic(RigidBodyWorld *rbw);
 static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int rebuild, int transfer_speed);
 
 static void activateRigidbody(RigidBodyOb* rbo, RigidBodyWorld *UNUSED(rbw), MeshIsland *UNUSED(mi), Object *UNUSED(ob))
@@ -2640,7 +2641,7 @@ static int rigidbody_group_count_items(const ListBase *group, int *r_num_objects
 /* Simulation Interface - Bullet */
 
 /* Update object array and rigid body count so they're in sync with the rigid body group */
-static void rigidbody_update_ob_array(RigidBodyWorld *rbw)
+void BKE_rigidbody_update_ob_array(RigidBodyWorld *rbw)
 {
 	GroupObject *go;
 	ModifierData *md;
@@ -2724,7 +2725,9 @@ static void rigidbody_update_sim_world(Scene *scene, RigidBodyWorld *rbw)
 
 	/* update object array in case there are changes */
 	if (!(rbw->flag & RBW_FLAG_REFRESH_MODIFIERS))
-		rigidbody_update_ob_array(rbw);
+	{
+		BKE_rigidbody_update_ob_array(rbw);
+	}
 }
 
 static void rigidbody_update_sim_ob(Scene *scene, RigidBodyWorld *rbw, Object *ob, RigidBodyOb *rbo, float centroid[3], MeshIsland *mi)
@@ -3047,7 +3050,7 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 			int frame = (int)BKE_scene_frame_get(scene);
 			if (BKE_lookup_mesh_state(fmd, frame, true))
 			{
-				rigidbody_update_ob_array(rbw);
+				BKE_rigidbody_update_ob_array(rbw);
 			}
 		}
 
@@ -3378,16 +3381,19 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw,
 				}
 			}
 
-			if (!is_zero_m4(fmd->origmat) && rbw && !(rbw->flag & RBW_FLAG_OBJECT_CHANGED)) {
+			if (!is_zero_m4(fmd->origmat) && rbw && !(rbw->flag & RBW_FLAG_OBJECT_CHANGED))
+			{
+				//if (fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED)
 				copy_m4_m4(ob->obmat, fmd->origmat);
 			}
 
 			if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
 			{
 				int frame = (int)ctime;
+
 				if (BKE_lookup_mesh_state(fmd, frame, true))
 				{
-					rigidbody_update_ob_array(rbw);
+					BKE_rigidbody_update_ob_array(rbw);
 				}
 			}
 
@@ -3577,11 +3583,32 @@ static bool restoreKinematic(RigidBodyWorld *rbw)
 	return did_it;
 }
 
+static void resetDynamic(RigidBodyWorld *rbw)
+{
+	GroupObject *go;
+	for (go = rbw->group->gobject.first; go; go = go->next)
+	{
+		FractureModifierData *fmd = modifiers_findByType(go->ob, eModifierType_Fracture);
+		if (fmd && fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
+		{
+			Scene *scene = fmd->modifier.scene;
+			fmd->last_frame = INT_MAX;
+			fmd->refresh = true;
+
+			//need really to trigger modifier stack evaluation here at once, next depgraph tag is too late
+			//apparently
+			makeDerivedMesh(scene, go->ob, NULL, scene->customdata_mask | CD_MASK_BAREMESH, 0);
+		}
+	}
+}
+
 void BKE_rigidbody_cache_reset(RigidBodyWorld *rbw)
 {
 	if (rbw) {
 		rbw->pointcache->flag |= PTCACHE_OUTDATED;
 		//restoreKinematic(rbw);
+		if (!(rbw->pointcache->flag & PTCACHE_BAKED))
+			resetDynamic(rbw);
 	}
 }
 
@@ -3615,6 +3642,10 @@ void BKE_rigidbody_rebuild_world(Scene *scene, float ctime)
 
 	if (ctime == startframe + 1 && rbw->ltime == startframe) {
 		if (cache->flag & PTCACHE_OUTDATED) {
+			//if we destroy the cache, also reset dynamic data (if not baked)
+			if (!(cache->flag & PTCACHE_BAKED))
+				resetDynamic(rbw);
+
 			BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
 			rigidbody_update_simulation(scene, rbw, true);
 			BKE_ptcache_validate(cache, (int)ctime);
@@ -3641,7 +3672,9 @@ void BKE_rigidbody_do_simulation(Scene *scene, float ctime)
 	if ((rbw->flag & RBW_FLAG_OBJECT_CHANGED))
 	{
 		rbw->flag &= ~RBW_FLAG_OBJECT_CHANGED;
-		rigidbody_update_simulation(scene, rbw, true);
+		if (!(cache->flag & PTCACHE_BAKED))
+			/* dont mess with baked data */
+			rigidbody_update_simulation(scene, rbw, true);
 		rbw->flag &= ~RBW_FLAG_REFRESH_MODIFIERS;
 	}
 
@@ -3667,7 +3700,7 @@ void BKE_rigidbody_do_simulation(Scene *scene, float ctime)
 	if (rbw->physics_world == NULL && !(cache->flag & PTCACHE_BAKED))
 		return;
 	else if ((rbw->objects == NULL) || (rbw->cache_index_map == NULL))
-		rigidbody_update_ob_array(rbw);
+		BKE_rigidbody_update_ob_array(rbw);
 
 	/* try to read from cache */
 	// RB_TODO deal with interpolated, old and baked results
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 45d087e..773e7382 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -4871,9 +4871,13 @@ static int initialize_meshisland(FractureModifierData* fmd, MeshIsland** mii, MV
 		if (mi->vertex_indices) {
 			mi->vertex_indices[k] = vertstart + k;
 		}
-		mi->vertco[k*3] = v->co[0];
-		mi->vertco[k*3+1] = v->co[1];
-		mi->vertco[k*3+2] = v->co[2];
+
+		if (fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED)
+		{
+			mi->vertco[k*3] = v->co[0];
+			mi->vertco[k*3+1] = v->co[1];
+			mi->vertco[k*3+2] = v->co[2];
+		}
 
 		if (mi->vertno != NULL && fmd->fix_normals) {
 			short sno[3];
@@ -4885,6 +4889,7 @@ static int initialize_meshisland(FractureModifierData* fmd, MeshIsland** mii, MV
 		}
 	}
 
+#if 0
 	if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
 	{
 		MeshIslandSequence *prev = NULL;
@@ -4915,6 +4920,7 @@ static int initialize_meshisland(FractureModifierData* fmd, MeshIsland** mii, MV
 			}
 		}
 	}
+#endif
 
 	return mi->vertex_count;
 }
@@ -4934,7 +4940,7 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd, Obje
 	fmd->vertex_island_map = NULL;
 
 	/*HARDCODING this for now, until we can version it properly, say with 2.75 ? */
-	if (fd->fileversion < 276) {
+	if (fd->fileversion < 275) {
 		fmd->fracture_mode = MOD_FRACTURE_PREFRACTURED;
 		fmd->shard_sequence.first = NULL;
 		fmd->shard_sequence.last = NULL;
@@ -4944,6 +4950,9 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd, Obje
 		fmd->fracture_settings.first = NULL;
 		fmd->fracture_settings.last = NULL;
 		fmd->active_setting = -1;
+
+		fmd->current_mi_entry = NULL;
+		fmd->current_shard_entry = NULL;
 	}
 	else
 	{
@@ -5028,7 +5037,6 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd, Obje
 				vertstart += initialize_meshisland(fmd, &mi, mverts, vertstart, ob, -1, -1);
 			}
 		}
-#if 0
 		else if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
 		{
 			ShardSequence *ssq = NULL;
@@ -5097,7 +5105,6 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd, Obje
 				fmd->current_mi_entry = msq;
 			}
 		}
-#endif
 
 		fmd->refresh_constraints = true;
 		fmd->meshConstraints.first = NULL;
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 9b7dcca..31629a7 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1721,7 +1721,6 @@ static void write_modifiers(WriteData *wd, ListBase *modbase)
 					}
 				}
 			}
-#if 0
 			else if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
 			{
 				ShardSequence *ssq;
@@ -1744,7 +1743,6 @@ static void write_modifiers(WriteData *wd, ListBase *modbase)
 					}
 				}
 			}
-#endif
 		}
 	}
 }
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index d2541f7..23f697f 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -2914,7 +2914,6 @@ static void do_island_from_shard(FractureModifierData *fmd, 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list