[Bf-blender-cvs] [6f71cb3] fracture_modifier: dynamic fracture: cache works much better now

Martin Felke noreply at git.blender.org
Wed Jun 3 11:26:16 CEST 2015


Commit: 6f71cb361ed4bce1c09bc085aba7ba3af2a3886a
Author: Martin Felke
Date:   Wed Jun 3 11:01:32 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rB6f71cb361ed4bce1c09bc085aba7ba3af2a3886a

dynamic fracture: cache works much better now

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

M	source/blender/blenkernel/intern/pointcache.c
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index 56cde57..5c08901 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -1015,7 +1015,7 @@ static int  ptcache_rigidbody_write(int index, void *rb_v, void **data, int cfra
 	}
 
 	ob = rbw->objects[rbw->cache_offset_map[index]];
-	fmd = modifiers_findByType(ob, eModifierType_Fracture);
+	fmd = (FractureModifierData*)modifiers_findByType(ob, eModifierType_Fracture);
 
 	if (rbo && rbo->type == RBO_TYPE_ACTIVE && rbo->physics_object &&
 	    (!(rbo->flag & RBO_FLAG_NEEDS_VALIDATE)))
@@ -1032,7 +1032,10 @@ static int  ptcache_rigidbody_write(int index, void *rb_v, void **data, int cfra
 		else if (fmd && fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
 		{
 			MeshIsland *mi = BLI_findlink(&fmd->meshIslands, rbo->meshisland_index);
-			int frame = (int)cfra - mi->start_frame;
+			int frame = (int)floor(cfra);
+			frame =  frame - mi->start_frame;
+
+			//printf("Writing frame %d %d %d %d\n", (int)cfra, mi->start_frame, frame, fmd->last_frame);
 
 			mi->locs[3*frame] = rbo->pos[0];
 			mi->locs[3*frame+1] = rbo->pos[1];
@@ -1042,6 +1045,10 @@ static int  ptcache_rigidbody_write(int index, void *rb_v, void **data, int cfra
 			mi->rots[4*frame+1] = rbo->orn[1];
 			mi->rots[4*frame+2] = rbo->orn[2];
 			mi->rots[4*frame+3] = rbo->orn[3];
+
+			//dummy data
+			PTCACHE_DATA_FROM(data, BPHYS_DATA_LOCATION, rbo->pos);
+			PTCACHE_DATA_FROM(data, BPHYS_DATA_ROTATION, rbo->orn);
 		}
 	}
 
@@ -1063,7 +1070,7 @@ static void ptcache_rigidbody_read(int index, void *rb_v, void **data, float cfr
 	}
 
 	ob = rbw->objects[rbw->cache_offset_map[index]];
-	fmd = modifiers_findByType(ob, eModifierType_Fracture);
+	fmd = (FractureModifierData*)modifiers_findByType(ob, eModifierType_Fracture);
 	if (!fmd || fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED)
 	{
 		if (rbo && rbo->type == RBO_TYPE_ACTIVE) {
@@ -1086,7 +1093,10 @@ static void ptcache_rigidbody_read(int index, void *rb_v, void **data, float cfr
 
 			//modifier should have "switched" this to current set of meshislands already.... so access it
 			MeshIsland *mi = BLI_findlink(&fmd->meshIslands, rbo->meshisland_index);
-			int frame = (int)cfra - mi->start_frame;
+			int frame = (int)floor(cfra);
+			frame = frame - mi->start_frame;
+
+			//printf("Reading frame %d %d %d %d\n", (int)cfra, mi->start_frame, frame, fmd->last_frame);
 
 			rbo->pos[0] = mi->locs[3*frame];
 			rbo->pos[1] = mi->locs[3*frame+1];
@@ -1114,7 +1124,7 @@ static void ptcache_rigidbody_interpolate(int index, void *rb_v, void **data, fl
 	}
 
 	ob = rbw->objects[rbw->cache_offset_map[index]];
-	fmd = modifiers_findByType(ob, eModifierType_Fracture);
+	fmd = (FractureModifierData*)modifiers_findByType(ob, eModifierType_Fracture);
 
 	if (rbo->type == RBO_TYPE_ACTIVE) {
 
@@ -1136,7 +1146,8 @@ static void ptcache_rigidbody_interpolate(int index, void *rb_v, void **data, fl
 			float loc[3], rot[4];
 
 			MeshIsland *mi = BLI_findlink(&fmd->meshIslands, rbo->meshisland_index);
-			int frame = (int)cfra2 - mi->start_frame;
+			int frame = (int)floor(cfra);
+			frame = frame - mi->start_frame;
 
 			loc[0] = mi->locs[3*frame];
 			loc[1] = mi->locs[3*frame+1];
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index f095349..3c73073 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2664,7 +2664,8 @@ static void rigidbody_update_sim_world(Scene *scene, RigidBodyWorld *rbw)
 	RB_dworld_set_gravity(rbw->physics_world, adj_gravity);
 
 	/* update object array in case there are changes */
-	rigidbody_update_ob_array(rbw);
+	if (!rbw->refresh_modifiers)
+		rigidbody_update_ob_array(rbw);
 }
 
 static void rigidbody_update_sim_ob(Scene *scene, RigidBodyWorld *rbw, Object *ob, RigidBodyOb *rbo, float centroid[3])
@@ -2953,7 +2954,18 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 
 	if (isModifierActive(fmd)) {
 		float max_con_mass = 0;
-		int count = BLI_listbase_count(&fmd->meshIslands);
+		int count = 0;//BLI_listbase_count(&fmd->meshIslands);
+
+		if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
+		{
+			int frame = (int)BKE_scene_frame_get(scene);
+			if (fmd->lookup_mesh_state(fmd, frame, true))
+			{
+				rigidbody_update_ob_array(rbw);
+			}
+		}
+
+		count = BLI_listbase_count(&fmd->meshIslands);
 
 		for (mi = fmd->meshIslands.first; mi; mi = mi->next) {
 			if (mi->rigidbody == NULL) {
@@ -2963,6 +2975,13 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 				/* perform simulation data updates as tagged */
 				/* refresh object... */
 				int do_rebuild = rebuild;
+
+				if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC && mi->rigidbody->physics_object) {
+					//printf("Velocities...\n");
+					RB_body_get_linear_velocity(mi->rigidbody->physics_object, mi->lin_vel);
+					RB_body_get_angular_velocity(mi->rigidbody->physics_object, mi->ang_vel);
+				}
+
 				if (fmd->use_breaking)
 				{
 					float weight = mi->thresh_weight;
@@ -3253,6 +3272,15 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw,
 				copy_m4_m4(ob->obmat, fmd->origmat);
 			}
 
+			if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
+			{
+				int frame = (int)ctime;
+				if (fmd->lookup_mesh_state(fmd, frame, true))
+				{
+					rigidbody_update_ob_array(rbw);
+				}
+			}
+
 			for (mi = fmd->meshIslands.first; mi; mi = mi->next) {
 
 				rbo = mi->rigidbody;
@@ -3496,10 +3524,10 @@ void BKE_rigidbody_do_simulation(Scene *scene, float ctime)
 
 	/*trigger dynamic update*/
 	if ((rbw->object_changed))
-	{   /* flag modifier refresh at their next execution XXX TODO -> still used ? */
-		//rbw->refresh_modifiers = true;
+	{
 		rbw->object_changed = false;
 		rigidbody_update_simulation(scene, rbw, true);
+		rbw->refresh_modifiers = false;
 	}
 
 	if (ctime <= startframe) {
@@ -3507,7 +3535,7 @@ void BKE_rigidbody_do_simulation(Scene *scene, float ctime)
 		rbw->rebuild_comp_con = true;
 
 		rbw->ltime = startframe;
-		if ((rbw->object_changed))
+		if (rbw->object_changed)
 		{       /* flag modifier refresh at their next execution XXX TODO -> still used ? */
 			rbw->refresh_modifiers = true;
 			rbw->object_changed = false;
@@ -3529,6 +3557,7 @@ void BKE_rigidbody_do_simulation(Scene *scene, float ctime)
 	/* try to read from cache */
 	// RB_TODO deal with interpolated, old and baked results
 	if (BKE_ptcache_read(&pid, ctime)) {
+		printf("Cache read:  %d\n", (int)ctime);
 		BKE_ptcache_validate(cache, (int)ctime);
 
 		rbw->ltime = ctime;
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 43291ea..7682dfa 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -4760,49 +4760,24 @@ static void read_meshIsland(FileData *fd, MeshIsland **address)
 }
 
 /*inlined from MOD_fracture.c*/
-static void do_match_vertex_coords(MeshIsland* mi, MeshIsland *par, Object *ob, int frame)
+static MeshIsland* find_meshisland(ListBase* meshIslands, int id)
 {
-	float loc[3] = {0.0f, 0.0f, 0.0f};
-	float rot[4] = {0.0f, 0.0f, 0.0f, 1.0f};
-	int j = 0;
-	float irot[4];
-	invert_m4_m4(ob->imat, ob->obmat);
-
-	loc[0] = par->locs[3*frame];
-	loc[1] = par->locs[3*frame+1];
-	loc[2] = par->locs[3*frame+2];
-
-	rot[0] = par->rots[4*frame];
-	rot[1] = par->rots[4*frame+1];
-	rot[2] = par->rots[4*frame+2];
-	rot[3] = par->rots[4*frame+3];
-
-	mul_m4_v3(ob->imat, loc);
-	mat4_to_quat(irot, ob->imat);
-	mul_qt_qtqt(rot, rot, irot);
-
-	//match vertices and vertco, perhaps vertno too, yuck...
-	for (j = 0; j < mi->vertex_count; j++)
+	MeshIsland* mi = meshIslands->first;
+	while (mi)
 	{
-		float co[3];
-
-		//mul_qt_v3(rot, mi->vertices_cached[j]->co);
-		add_v3_v3(mi->vertices_cached[j]->co, loc);
-
-		co[0] = mi->vertco[3*j];
-		co[1] = mi->vertco[3*j+1];
-		co[2] = mi->vertco[3*j+2];
-
-		//mul_qt_v3(rot, co);
-		add_v3_v3(co, loc);
+		if (mi->id == id)
+		{
+			return mi;
+		}
 
-		mi->vertco[3*j]   = co[0];
-		mi->vertco[3*j+1] = co[1];
-		mi->vertco[3*j+2] = co[2];
+		mi = mi->next;
 	}
+
+	return NULL;
 }
 
-static int initialize_meshisland(FractureModifierData* fmd, MeshIsland** mii, MVert* mverts, int vertstart, Object *ob, ShardID parent_id)
+static int initialize_meshisland(FractureModifierData* fmd, MeshIsland** mii, MVert* mverts, int vertstart,
+                                 Object *ob, ShardID parent_id, ShardID shard_id)
 {
 	MVert *mv;
 	int k = 0;
@@ -4844,12 +4819,21 @@ static int initialize_meshisland(FractureModifierData* fmd, MeshIsland** mii, MV
 		{
 			MeshIsland *par = NULL;
 			int frame = prev->frame;
-			par = BLI_findlink(&prev->meshIslands, parent_id);
-			frame -= par->start_frame;
 
+			par = find_meshisland(&prev->meshIslands, parent_id);
 			if (par)
 			{
-				do_match_vertex_coords(mi, par, ob, frame);
+				frame -= par->start_frame;
+				fmd->do_match_vertex_coords(mi, par, ob, frame, true);
+			}
+			else
+			{
+				par = find_meshisland(&prev->meshIslands, shard_id);
+				if (par)
+				{
+					frame -= par->start_frame;
+					fmd->do_match_vertex_coords(mi, par, ob, frame, false);
+				}
 			}
 		}
 	}
@@ -4873,7 +4857,7 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd, Obje
 
 	/*HARDCODING this for now, until we can version it properly, say with 2.75 ? */
 	if (fd->fileversion < 275) {
-		fmd->fracture_mode = MOD_FRACTURE_PREFRACTURED;
+		//fmd->fracture_mode = MOD_FRACTURE_PREFRACTURED;
 	}
 
 	if (fm == NULL || fmd->dm_group) {
@@ -4951,7 +4935,7 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd, Obje
 
 			for (mi = fmd->meshIslands.first; mi; mi = mi->next) {
 				read_meshIsland(fd, &mi);
-				vertstart += initialize_meshisland(fmd, &mi, mverts, vertstart, ob, -1);
+				vertstart += initialize_meshisland(fmd, &mi, mverts, vertstart, ob, -1, -1);
 			}
 		}
 		else if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
@@ -4992,7 +4976,7 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *f

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list