[Bf-blender-cvs] [9624808] fracture_modifier: fracturing multiple settings seems to work (again) but todo: splinters, multiple islands / setting, constraints

Martin Felke noreply at git.blender.org
Sun Oct 18 11:26:17 CEST 2015


Commit: 962480865a2adbfe26e549e5291be0f399e62339
Author: Martin Felke
Date:   Sun Oct 18 11:25:52 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rB962480865a2adbfe26e549e5291be0f399e62339

fracturing multiple settings seems to work (again) but todo: splinters, multiple islands / setting, constraints

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

M	source/blender/blenkernel/BKE_fracture.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index b2d8b27..17c3e92 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -87,7 +87,7 @@ struct DerivedMesh *BKE_shard_create_dm(struct Shard *s, bool doCustomData);
 /* create shards from base mesh and a list of points */
 void BKE_fracture_shard_by_points(struct FracMesh *fmesh, ShardID id, struct FracPointCloud *points, int algorithm,
                                   struct Object *obj, struct DerivedMesh *dm, short inner_material_index, float mat[4][4],
-                                  int num_cuts, float fractal, bool smooth, int num_levels, int mode, bool reset, int active_setting);
+                                  int num_cuts, float fractal, bool smooth, int num_levels, int mode, bool reset, int active_setting, int num_settings);
 
 /* create shards from a base mesh and a set of other objects / cutter planes */
 void BKE_fracture_shard_by_planes(struct FractureModifierData *fmd, struct Object *obj, short inner_material_index, float mat[4][4]);
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 3ebe3c8..07e346b 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -615,7 +615,8 @@ static bool handle_boolean_bisect(FracMesh *fm, Object *obj, int expected_shards
 }
 
 static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int algorithm, Shard *p, float (*centroid)[3],
-                             DerivedMesh **dm_parent, BMesh** bm_parent, Shard ***tempshards, Shard ***tempresults, int active_setting)
+                             DerivedMesh **dm_parent, BMesh** bm_parent, Shard ***tempshards, Shard ***tempresults,
+                             int active_setting, int num_settings)
 {
 	int i;
 	Shard *s = NULL;
@@ -708,15 +709,20 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int
 	//skipping /deletion pass
 	for (i = 0; i < expected_shards; i++)
 	{
+		Shard *t = NULL;
 		if (fm->cancel == 1) {
 			break;
 		}
 
-		if (skipmap[i])
+		if (fm->last_shards && i < fm->shard_count)
+			t = fm->last_shards[i];
+
+		if (skipmap[i] /*&& ((t &&
+		    t->setting_id == active_setting &&
+		    t->shard_id > num_settings) || !t)*/)
 		{
 			printf("Skipping shard: %d\n", i);
 			(*tempshards)[i] = NULL;
-			(*tempresults)[i] = NULL;
 		}
 		else
 		{
@@ -726,6 +732,7 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int
 		}
 
 		(*tempresults)[i] = NULL;
+
 		fm->progress_counter++;
 	}
 
@@ -738,11 +745,11 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int
 			if (!t)
 				continue;
 
-			if (/*t->parent_id == p->shard_id ||*/ t->setting_id == active_setting)
+			if (t->setting_id == active_setting /*|| t->shard_id < num_settings*/)
 			{
 				printf("Deleting shard: %d %d %d\n", i, t->shard_id, t->setting_id);
 				BLI_remlink_safe(&fm->shard_map, t);
-				BKE_shard_free(t, true);
+				BKE_shard_free(t, false);
 				fm->last_shards[i] = NULL;
 			}
 			else
@@ -762,7 +769,7 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int
 /* parse the voro++ cell data */
 static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, FracMesh *fm, int algorithm, Object *obj, DerivedMesh *dm,
                         short inner_material_index, float mat[4][4], int num_cuts, float fractal, bool smooth, int num_levels, int mode,
-                        bool reset, int active_setting)
+                        bool reset, int active_setting, int num_settings)
 {
 	/*Parse voronoi raw data*/
 	int i = 0, j = 0, count = 0;
@@ -874,7 +881,7 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra
 
 	unit_m4(obmat);
 
-	do_prepare_cells(fm, cells, expected_shards, algorithm, p, &centroid, &dm_parent, &bm_parent, &tempshards, &tempresults, active_setting);
+	do_prepare_cells(fm, cells, expected_shards, algorithm, p, &centroid, &dm_parent, &bm_parent, &tempshards, &tempresults, active_setting, num_settings);
 
 	if (fm->last_shard_tree)
 	{
@@ -944,10 +951,10 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra
 	//keep empty ids... need to catch this later
 	if (mode == MOD_FRACTURE_DYNAMIC || active_setting > -1)
 	{
-		j = 0;
+		j = 1;
 
-		if (mode == MOD_FRACTURE_DYNAMIC)
-			j = 1;
+		//if (mode == MOD_FRACTURE_DYNAMIC)
+		//	j = 1;
 
 		if (fm->shard_map.last)
 		{
@@ -982,7 +989,7 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra
 			}
 		}
 
-		if (t != NULL) {
+		if (t != NULL && t != s) {
 			BKE_shard_free(t, false);
 		}
 	}
@@ -1476,7 +1483,7 @@ void BKE_fracture_shard_by_planes(FractureModifierData *fmd, Object *obj, short
 
 void BKE_fracture_shard_by_points(FracMesh *fmesh, ShardID id, FracPointCloud *pointcloud, int algorithm, Object *obj, DerivedMesh *dm, short
                                   inner_material_index, float mat[4][4], int num_cuts, float fractal, bool smooth, int num_levels, int mode,
-                                  bool reset, int active_setting)
+                                  bool reset, int active_setting, int num_settings)
 {
 	int n_size = 8;
 	
@@ -1495,7 +1502,7 @@ void BKE_fracture_shard_by_points(FracMesh *fmesh, ShardID id, FracPointCloud *p
 #endif
 	
 	shard = BKE_shard_by_id(fmesh, id, dm);
-	if (!shard || shard->flag & SHARD_FRACTURED) {
+	if (!shard || (shard->flag & SHARD_FRACTURED && (mode == MOD_FRACTURE_DYNAMIC))) {
 		if (id == 0)
 		{
 			//fallback to entire mesh
@@ -1547,7 +1554,7 @@ void BKE_fracture_shard_by_points(FracMesh *fmesh, ShardID id, FracPointCloud *p
 
 	/*Evaluate result*/
 	parse_cells(voro_cells, pointcloud->totpoints, id, fmesh, algorithm, obj, dm, inner_material_index, mat,
-	            num_cuts, fractal, smooth, num_levels, mode, reset, active_setting);
+	            num_cuts, fractal, smooth, num_levels, mode, reset, active_setting, num_settings);
 
 	/*Free structs in C++ area of memory */
 	cells_free(voro_cells, pointcloud->totpoints);
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 635442c..173de5a 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -482,7 +482,6 @@ static void rna_Modifier_update_and_keep(Main *UNUSED(bmain), Scene *UNUSED(scen
 
 static void rna_Modifier_update_index(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
 {
-	FractureModifierData *fmd = NULL;
 	ModifierData* md = ptr->data;
 
 	if (md && md->type == eModifierType_Fracture)
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index b443c82..c4582d3 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -1139,13 +1139,6 @@ static Shard* do_splinters(FractureModifierData *fmd, FracPointCloud points, flo
 
 	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)
 	{
@@ -1166,11 +1159,15 @@ static Shard* do_splinters(FractureModifierData *fmd, FracPointCloud points, flo
 	{
 		int i = 0, num_verts = 0;
 		MVert* mvert = NULL, *mv;
-		invert_m4_m4(imat, *mat);
+
 
 		if (s) {
 			mvert = s->mvert;
 			num_verts = s->totvert;
+			/* copy location to matrix */
+			/*(*mat)[3][0] = s->centroid[0];
+			(*mat)[3][1] = s->centroid[1];
+			(*mat)[3][2] = s->centroid[2];*/
 		}
 		else
 		{
@@ -1178,6 +1175,8 @@ static Shard* do_splinters(FractureModifierData *fmd, FracPointCloud points, flo
 			num_verts = dm->getNumVerts(dm);
 		}
 
+		invert_m4_m4(imat, *mat);
+
 		for (i = 0; i < points.totpoints; i++)
 		{
 			mul_m4_v3(imat, points.points[i].co);
@@ -1290,6 +1289,7 @@ static void do_fracture(FractureModifierData *fmd, ShardID id, Object *obj, Deri
 {
 	/* dummy point cloud, random */
 	FracPointCloud points;
+	int num_settings = BLI_listbase_count(&fmd->fracture_settings);
 
 	points = get_points_global(fmd, obj, dm, id);
 
@@ -1308,7 +1308,7 @@ static void do_fracture(FractureModifierData *fmd, ShardID id, Object *obj, Deri
 		if (points.totpoints > 0) {
 			BKE_fracture_shard_by_points(fmd->frac_mesh, id, &points, fmd->frac_algorithm, obj, dm, mat_index, mat,
 			                             fmd->fractal_cuts, fmd->fractal_amount, fmd->use_smooth, fmd->fractal_iterations,
-			                             fmd->fracture_mode, fmd->reset_shards, fmd->active_setting);
+			                             fmd->fracture_mode, fmd->reset_shards, fmd->active_setting, num_settings);
 		}
 
 		/*TODO, limit this to settings shards !*/
@@ -1337,7 +1337,8 @@ 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, mat, s, dm);
+		if (!s)
+			cleanup_splinters(fmd, mat, s, dm);
 		fmd->reset_shards = false;
 	}
 	MEM_freeN(points.points);
@@ -4012,6 +4013,7 @@ static void do_prehalving(FractureModifierData *fmd, Object* ob, DerivedMesh* de
 	bool shards_to_islands = fmd->shards_to_islands;
 	Shard *s, *next = NULL;
 	int num_settings = BLI_listbase_count(&fmd->fracture_settings);
+	bool check = check_first_shards(fmd);
 
 	if (fmd->visible_mesh != NULL) {
 		BM_mesh_free(fmd->visible_mesh);
@@ -4047,7 +4049,7 @@ static void do_prehalving(FractureModifierData *fmd, Object* ob, DerivedMesh* de
 			t->setting_id = -1;
 		}
 
-		if (((t->setting_id == fmd->active_setting) && fmd->refresh) || (!fmd->refresh))
+		if (((t->setting_id == fmd->active_setting) && fmd->refresh && !check) || (!fmd->refresh))
 		{
 			BLI_addtail(&fmd->frac_mesh->shard_map, t);
 			printf("Adding shard: %d %d \n", t->shard_id, t->setting_id);
@@ -4055,7 +4057,7 @@ static void do_prehalving(FractureModifierData *fmd, 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list