[Bf-blender-cvs] [0eae9ab] fracture_modifier: fix attempt for splinters, did crash.. now works but its incorrect for multiple settings

Martin Felke noreply at git.blender.org
Sat Oct 17 19:00:55 CEST 2015


Commit: 0eae9ab1152974f026ec14db0d231ac0682feb40
Author: Martin Felke
Date:   Sat Oct 17 17:49:10 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rB0eae9ab1152974f026ec14db0d231ac0682feb40

fix attempt for splinters, did crash.. now works but its incorrect for multiple settings

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

M	source/blender/blenkernel/intern/fracture.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 f0ff619..3ebe3c8 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -795,18 +795,25 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra
 		return;
 	}
 
-	if (mode == MOD_FRACTURE_PREFRACTURED && reset)
+/*	if (mode == MOD_FRACTURE_PREFRACTURED && reset)
 	{
-		while (fm->shard_map.first)
+		Shard *t = fm->shard_map.first, *next = NULL;
+		while (t && t->next)
 		{
-			Shard *t = fm->shard_map.first;
-			BLI_remlink_safe(&fm->shard_map, t);
-			printf("Resetting shard: %d\n", t->shard_id);
-			BKE_shard_free(t, true);
+			next = t->next;
+
+			if (t != p)
+			{
+				BLI_remlink_safe(&fm->shard_map, t);
+				printf("Resetting shard: %d\n", t->shard_id);
+				BKE_shard_free(t, true);
+			}
+
+			t = next;
 		}
-	}
+	}*/
 
-	if (mode == MOD_FRACTURE_PREFRACTURED && !reset)
+	if (mode == MOD_FRACTURE_PREFRACTURED /*&& !reset*/)
 	{
 		//rebuild tree
 		if (!fm->last_shard_tree && (fm->shard_count > 0) && mode == MOD_FRACTURE_PREFRACTURED)
@@ -2026,6 +2033,7 @@ void BKE_fracture_load_settings(FractureModifierData *fmd, FractureSetting *fs)
 	fmd->point_source = fs->point_source;
 
 	fmd->use_particle_birth_coordinates = fs->use_particle_birth_coordinates;
+	fmd->splinter_axis = fs->splinter_axis;
 	fmd->splinter_length = fs->splinter_length;
 	fmd->cluster_solver_iterations_override = fs->cluster_solver_iterations_override;
 
@@ -2096,6 +2104,7 @@ void BKE_fracture_store_settings(FractureModifierData *fs, FractureSetting *fmd)
 
 	fmd->use_particle_birth_coordinates = fs->use_particle_birth_coordinates;
 	fmd->splinter_length = fs->splinter_length;
+	fmd->splinter_axis = fs->splinter_axis;
 	fmd->cluster_solver_iterations_override = fs->cluster_solver_iterations_override;
 
 	fmd->cluster_breaking_angle = fs->cluster_breaking_angle;
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index fb4fb03..b443c82 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -1130,11 +1130,22 @@ static Material* find_material(const char* name)
 	return BKE_material_add(G.main, name);
 }
 
-static void do_splinters(FractureModifierData *fmd, FracPointCloud points, DerivedMesh *dm, float(*mat)[4][4])
+static Shard* do_splinters(FractureModifierData *fmd, FracPointCloud points, float(*mat)[4][4], ShardID id, DerivedMesh *dm)
 {
 	float imat[4][4];
+
+	/*need to add island / shard centroid...*/
+	Shard *s = BKE_shard_by_id(fmd->frac_mesh, id, NULL);
+
 	unit_m4(*mat);
 
+	/* copy location to matrix */
+	if (s) {
+		(*mat)[3][0] = s->centroid[0];
+		(*mat)[3][1] = s->centroid[1];
+		(*mat)[3][2] = s->centroid[2];
+	}
+
 	/*splinters... just global axises and a length, for rotation rotate the object */
 	if (fmd->splinter_axis & MOD_FRACTURE_SPLINTER_X)
 	{
@@ -1153,20 +1164,32 @@ static void do_splinters(FractureModifierData *fmd, FracPointCloud points, Deriv
 		(fmd->splinter_axis & MOD_FRACTURE_SPLINTER_Y) ||
 		(fmd->splinter_axis & MOD_FRACTURE_SPLINTER_Z))
 	{
-		int i = 0;
-		MVert* mvert = dm->getVertArray(dm), *mv;
+		int i = 0, num_verts = 0;
+		MVert* mvert = NULL, *mv;
 		invert_m4_m4(imat, *mat);
 
+		if (s) {
+			mvert = s->mvert;
+			num_verts = s->totvert;
+		}
+		else
+		{
+			mvert = dm->getVertArray(dm);
+			num_verts = dm->getNumVerts(dm);
+		}
+
 		for (i = 0; i < points.totpoints; i++)
 		{
 			mul_m4_v3(imat, points.points[i].co);
 		}
 
-		for (i = 0, mv = mvert; i < dm->getNumVerts(dm); i++, mv++)
+		for (i = 0, mv = mvert; i < num_verts; i++, mv++)
 		{
 			mul_m4_v3(imat, mv->co);
 		}
 	}
+
+	return s;
 }
 
 static short do_materials(FractureModifierData *fmd, Object* obj)
@@ -1237,15 +1260,26 @@ static short do_materials(FractureModifierData *fmd, Object* obj)
 	return mat_index;
 }
 
-static void cleanup_splinters(FractureModifierData *fmd, DerivedMesh *dm, float mat[4][4])
+static void cleanup_splinters(FractureModifierData *fmd, float mat[4][4], Shard *s, DerivedMesh *dm)
 {
 	if ((fmd->splinter_axis & MOD_FRACTURE_SPLINTER_X) ||
 		(fmd->splinter_axis & MOD_FRACTURE_SPLINTER_Y) ||
 		(fmd->splinter_axis & MOD_FRACTURE_SPLINTER_Z))
 	{
-		int i = 0;
-		MVert* mvert = dm->getVertArray(dm), *mv;
-		for (i = 0, mv = mvert; i < dm->getNumVerts(dm); i++, mv++)
+		int i = 0, num_verts = 0;
+		MVert* mvert = NULL, *mv;
+
+		if (s) {
+			mvert = s->mvert;
+			num_verts = s->totvert;
+		}
+		else
+		{
+			mvert = dm->getVertArray(dm);
+			num_verts = dm->getNumVerts(dm);
+		}
+
+		for (i = 0, mv = mvert; i < num_verts; i++, mv++)
 		{
 			mul_m4_v3(mat, mv->co);
 		}
@@ -1263,9 +1297,10 @@ static void do_fracture(FractureModifierData *fmd, ShardID id, Object *obj, Deri
 		bool temp = fmd->shards_to_islands;
 		short mat_index = 0;
 		float mat[4][4];
+		Shard *s = NULL;
 
 		/*splinters... just global axises and a length, for rotation rotate the object */
-		do_splinters(fmd, points, dm, &mat);
+		s = do_splinters(fmd, points, &mat, id, dm);
 
 		mat_index = do_materials(fmd, obj);
 		mat_index = mat_index > 0 ? mat_index - 1 : mat_index;
@@ -1302,7 +1337,7 @@ static void do_fracture(FractureModifierData *fmd, ShardID id, Object *obj, Deri
 		BKE_fracture_create_dm(fmd, true);
 		fmd->shards_to_islands = temp;
 
-		cleanup_splinters(fmd, dm, mat);
+		cleanup_splinters(fmd, mat, s, dm);
 		fmd->reset_shards = false;
 	}
 	MEM_freeN(points.points);




More information about the Bf-blender-cvs mailing list