[Bf-blender-cvs] [f0f3873] fracture_modifier: fix for wrong transformation of shards after loading (and fix for potential crashers while loading)

Martin Felke noreply at git.blender.org
Sun Feb 21 20:26:29 CET 2016


Commit: f0f38731db41c126da271b10767b823e70856cd1
Author: Martin Felke
Date:   Sun Feb 21 19:53:04 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rBf0f38731db41c126da271b10767b823e70856cd1

fix for wrong transformation of shards after loading (and fix for potential crashers while loading)

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

M	source/blender/blenloader/intern/readfile.c

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

diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 3a81747..a188aff 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -233,7 +233,7 @@ typedef struct OldNewMap {
 
 /* local prototypes */
 static void *read_struct(FileData *fd, BHead *bh, const char *blockname);
-static void direct_link_modifiers(FileData *fd, ListBase *lb, Object* ob);
+static void direct_link_modifiers(FileData *fd, ListBase *lb);
 static void convert_tface_mt(FileData *fd, Main *main);
 static BHead *find_bhead_from_code_name(FileData *fd, const short idcode, const char *name);
 static BHead *find_bhead_from_idname(FileData *fd, const char *idname);
@@ -5087,36 +5087,19 @@ static void read_meshIsland(FileData *fd, MeshIsland **address)
 	mi->particle_index = -1;
 }
 
-/*inlined from MOD_fracture.c*/
-static MeshIsland* find_meshisland(ListBase* meshIslands, int id)
-{
-	MeshIsland* mi = meshIslands->first;
-	while (mi)
-	{
-		if (mi->id == id)
-		{
-			return mi;
-		}
-
-		mi = mi->next;
-	}
-
-	return NULL;
-}
-
 static int initialize_meshisland(FractureModifierData* fmd, MeshIsland** mii, MVert* mverts, int vertstart,
-                                 Object *ob, ShardID parent_id, ShardID shard_id)
+                                 Shard* s)
 {
 	MVert *mv;
 	int k = 0;
 	MeshIsland* mi = *mii;
 
 	mi->vertices_cached = MEM_mallocN(sizeof(MVert*) * mi->vertex_count, "mi->vertices_cached readfile");
-	mv = mi->physics_mesh->getVertArray(mi->physics_mesh);
+	mv = s->mvert;
 
 	for (k = 0; k < mi->vertex_count; k++) {
 		MVert* v = mverts + vertstart + k ;
-		MVert* v2 = mv + k;
+		MVert* v2 = k < s->totvert ? mv + k : NULL;
 		mi->vertices_cached[k] = v;
 		if (mi->vertex_indices) {
 			mi->vertex_indices[k] = vertstart + k;
@@ -5135,48 +5118,21 @@ static int initialize_meshisland(FractureModifierData* fmd, MeshIsland** mii, MV
 			sno[1] = mi->vertno[k*3+1];
 			sno[2] = mi->vertno[k*3+2];
 			copy_v3_v3_short(v->no, sno);
-			copy_v3_v3_short(v2->no, sno);
-		}
-	}
-
-#if 0
-	if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
-	{
-		MeshIslandSequence *prev = NULL;
-
-		if (fmd->current_mi_entry) {
-			prev = fmd->current_mi_entry->prev;
+			if (v2)
+				copy_v3_v3_short(v2->no, sno);
 		}
 
-		if (prev)
-		{
-			MeshIsland *par = NULL;
-			int frame = prev->frame;
-
-			par = find_meshisland(&prev->meshIslands, parent_id);
-			if (par)
-			{
-				frame -= par->start_frame;
-				BKE_match_vertex_coords(mi, par, ob, frame, true);
-			}
-			else
-			{
-				par = find_meshisland(&prev->meshIslands, shard_id);
-				if (par)
-				{
-					frame -= par->start_frame;
-					BKE_match_vertex_coords(mi, par, ob, frame, false);
-				}
-			}
-		}
+		if (v2)
+			sub_v3_v3(v2->co, s->centroid);
 	}
-#endif
+
+	mi->physics_mesh = BKE_shard_create_dm(s, true);
 
 	return mi->vertex_count;
 }
 
 /*refactor this loading routine out, for better readability*/
-static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd, Object* ob)
+static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd)
 {
 	FracMesh* fm;
 	bool autoexec = false;
@@ -5234,10 +5190,6 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd, Obje
 	}
 	else {
 		MeshIsland *mi;
-		MVert *mverts;
-		int vertstart = 0;
-		Shard *s, **shards = NULL;
-		int count = 0;
 
 		fm->last_shard_tree = NULL;
 		fm->last_shards = NULL;
@@ -5246,12 +5198,16 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd, Obje
 		    fmd->fracture_mode == MOD_FRACTURE_EXTERNAL)
 		{
 			/*create temp array for quicker lookups*/
-			int count = 0;
+			int count = 0, islandShardCount = 0;
 			int i = 0;
+			MVert *mverts;
+			int vertstart = 0;
+			Shard *s, **shards = NULL;
 
 			link_list(fd, &fmd->frac_mesh->shard_map);
 			link_list(fd, &fmd->islandShards);
-			count = BLI_listbase_count(&fmd->frac_mesh->shard_map) + BLI_listbase_count(&fmd->islandShards);
+			islandShardCount = BLI_listbase_count(&fmd->islandShards);
+			count = BLI_listbase_count(&fmd->frac_mesh->shard_map) + islandShardCount;
 
 			shards = MEM_callocN(sizeof(Shard*) * count, "readfile shard_lookup_array");
 			for (s = fmd->frac_mesh->shard_map.first; s; s = s->next) {
@@ -5270,9 +5226,8 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd, Obje
 			}
 
 			link_list(fd, &fmd->meshIslands);
-			count = BLI_listbase_count(&fmd->islandShards);
 
-			if ((fmd->islandShards.first == NULL || count == 0) && fm->shard_count > 0) {
+			if ((fmd->islandShards.first == NULL || islandShardCount == 0) && fm->shard_count > 0) {
 				/* oops, a refresh was missing, so disable this flag here better, otherwise
 				 * we attempt to load non existing data */
 				fmd->shards_to_islands = false;
@@ -5302,13 +5257,12 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd, Obje
 
 			i = 0;
 			for (mi = fmd->meshIslands.first; mi; mi = mi->next) {
-				Shard *s = NULL;
-				s = shards[i];
-				if (s)
+				Shard *sh = NULL;
+				sh = shards[i];
+				if (sh)
 				{
-					mi->physics_mesh = BKE_shard_create_dm(s, true);
 					read_meshIsland(fd, &mi);
-					vertstart += initialize_meshisland(fmd, &mi, mverts, vertstart, ob, -1, -1);
+					vertstart += initialize_meshisland(fmd, &mi, mverts, vertstart, sh);
 				}
 				i++;
 			}
@@ -5333,6 +5287,7 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd, Obje
 		{
 			ShardSequence *ssq = NULL;
 			MeshIslandSequence *msq = NULL;
+			Shard *s;
 
 			fmd->dm = NULL;
 			link_list(fd, &fmd->shard_sequence);
@@ -5370,7 +5325,7 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd, Obje
 				for (mi = msq->meshIslands.first; mi; mi = mi->next) {
 					read_meshIsland(fd, &mi);
 					mi->physics_mesh = BKE_shard_create_dm(sh, true);
-					vertstart += initialize_meshisland(fmd, &mi, mverts, vertstart, ob, sh->parent_id, sh->shard_id);
+					vertstart += initialize_meshisland(fmd, &mi, mverts, vertstart, sh);
 					sh = sh->next;
 				}
 
@@ -5413,7 +5368,7 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd, Obje
 	}
 }
 
-static void direct_link_modifiers(FileData *fd, ListBase *lb, Object *ob)
+static void direct_link_modifiers(FileData *fd, ListBase *lb)
 {
 	ModifierData *md;
 	
@@ -5692,7 +5647,7 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb, Object *ob)
 		}
 		else if (md->type == eModifierType_Fracture) {
 			FractureModifierData *fmd = (FractureModifierData *)md;
-			load_fracture_modifier(fd, fmd, ob);
+			load_fracture_modifier(fd, fmd);
 		}
 		else if (md->type == eModifierType_CorrectiveSmooth) {
 			CorrectiveSmoothModifierData *csmd = (CorrectiveSmoothModifierData*)md;
@@ -5761,7 +5716,7 @@ static void direct_link_object(FileData *fd, Object *ob)
 	ob->matbits= newdataadr(fd, ob->matbits);
 	
 	/* do it here, below old data gets converted */
-	direct_link_modifiers(fd, &ob->modifiers, ob);
+	direct_link_modifiers(fd, &ob->modifiers);
 	
 	link_list(fd, &ob->effect);
 	paf= ob->effect.first;




More information about the Bf-blender-cvs mailing list