[Bf-blender-cvs] [4a2dad0] fracture_modifier: multiple fracturing settings seem to work, but tested with 1 file only for now...

Martin Felke noreply at git.blender.org
Sat Oct 17 15:49:48 CEST 2015


Commit: 4a2dad0f8d53b99b0c48f2796b841aa8f911c5fd
Author: Martin Felke
Date:   Sat Oct 17 15:28:21 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rB4a2dad0f8d53b99b0c48f2796b841aa8f911c5fd

multiple fracturing settings seem to work, but tested with 1 file only for now...

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

M	source/blender/blenkernel/BKE_fracture.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/makesdna/DNA_fracture_types.h
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 418b583..b2d8b27 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 num_cuts, float fractal, bool smooth, int num_levels, int mode, bool reset, int active_setting);
 
 /* 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 1b6a763..f0ff619 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -360,6 +360,9 @@ Shard *BKE_create_fracture_shard(MVert *mvert, MPoly *mpoly, MLoop *mloop, int t
 	}
 
 	shard->shard_id = -1;
+	shard->setting_id = -1;
+	shard->parent_id = -1;
+
 	shard->flag = SHARD_INTACT;
 	BKE_shard_calc_minmax(shard);
 
@@ -612,7 +615,7 @@ 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)
+                             DerivedMesh **dm_parent, BMesh** bm_parent, Shard ***tempshards, Shard ***tempresults, int active_setting)
 {
 	int i;
 	Shard *s = NULL;
@@ -732,16 +735,19 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int
 		{
 			Shard *t = fm->last_shards[i];
 
-			if (t->parent_id == p->shard_id)
+			if (!t)
+				continue;
+
+			if (/*t->parent_id == p->shard_id ||*/ t->setting_id == active_setting)
 			{
+				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);
 				fm->last_shards[i] = NULL;
-				printf("Deleting shard: %d\n", i);
 			}
 			else
 			{
-				printf("NOT Deleting shard: %d\n", i);
+				printf("NOT Deleting shard: %d %d %d\n", i, t->shard_id, t->setting_id);
 			}
 		}
 	}
@@ -756,7 +762,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)
+                        bool reset, int active_setting)
 {
 	/*Parse voronoi raw data*/
 	int i = 0, j = 0, count = 0;
@@ -861,7 +867,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);
+	do_prepare_cells(fm, cells, expected_shards, algorithm, p, &centroid, &dm_parent, &bm_parent, &tempshards, &tempresults, active_setting);
 
 	if (fm->last_shard_tree)
 	{
@@ -917,25 +923,29 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra
 		dm_p = NULL;
 	}
 
-
 	//if (p->shard_id == -2)
-	if (p && parent_id == -2)
+	if (p && (parent_id == -2 /*|| parent_id == -1*/))
 	{
+		BLI_remlink_safe(&fm->shard_map, p);
 		BKE_shard_free(p, true);
+		p = NULL;
 	}
 
 	fm->shard_count = 0; /* may be not matching with expected shards, so reset... did increment this for
 	                      *progressbar only */
 
 	//keep empty ids... need to catch this later
-	if (mode == MOD_FRACTURE_DYNAMIC)
+	if (mode == MOD_FRACTURE_DYNAMIC || active_setting > -1)
 	{
-		j = 1;
+		j = 0;
+
+		if (mode == MOD_FRACTURE_DYNAMIC)
+			j = 1;
+
 		if (fm->shard_map.last)
 		{
 			j += ((Shard*)(fm->shard_map.last))->shard_id;
 		}
-
 	}
 	else
 	{
@@ -950,7 +960,8 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra
 			add_shard(fm, s, mat);
 			s->shard_id += j+1;
 			s->parent_id = parent_id;
-			//printf("ADDED: %d %d %d\n", i, j, s->shard_id);
+			s->setting_id = active_setting;
+			printf("ADDED: %d %d %d\n", i, j, s->shard_id);
 			if (parent_id > -1)
 			{
 				int i = 0;
@@ -1458,7 +1469,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)
+                                  bool reset, int active_setting)
 {
 	int n_size = 8;
 	
@@ -1529,7 +1540,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);
+	            num_cuts, fractal, smooth, num_levels, mode, reset, active_setting);
 
 	/*Free structs in C++ area of memory */
 	cells_free(voro_cells, pointcloud->totpoints);
@@ -2043,6 +2054,9 @@ void BKE_fracture_store_settings(FractureModifierData *fs, FractureSetting *fmd)
 	/*copy settings values to FM itself....*/
 
 	/* vgroups  XXX TODO non ascii strings ?*/
+	if (!fmd || !fs)
+		return;
+
 	strncpy(fmd->thresh_defgrp_name, fs->thresh_defgrp_name, strlen(fs->thresh_defgrp_name));
 	strncpy(fmd->ground_defgrp_name, fs->ground_defgrp_name, strlen(fs->ground_defgrp_name));
 	strncpy(fmd->inner_defgrp_name, fs->inner_defgrp_name, strlen(fs->inner_defgrp_name));
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index ed60793..45d087e 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -4943,7 +4943,7 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd, Obje
 
 		fmd->fracture_settings.first = NULL;
 		fmd->fracture_settings.last = NULL;
-		fmd->active_setting = 0;
+		fmd->active_setting = -1;
 	}
 	else
 	{
diff --git a/source/blender/makesdna/DNA_fracture_types.h b/source/blender/makesdna/DNA_fracture_types.h
index 3292f35..76f341f 100644
--- a/source/blender/makesdna/DNA_fracture_types.h
+++ b/source/blender/makesdna/DNA_fracture_types.h
@@ -72,10 +72,11 @@ typedef struct Shard {
 	int neighbor_count; /* counts of neighbor islands */
 	int parent_id;      /* the shard from which this shard originates, we keep all shards in the shardmap */
 	int flag;           /* flag for fracture state (INTACT, FRACTURED)*/
+	int setting_id;     /* to which setting this shard belongs, -1 for none or no settings available*/
 	float raw_volume;
 	float impact_loc[3]; /* last impact location on this shard */
 	float impact_size[3]; /* size of impact area (simplified) */
-	char pad2[4];
+	//char pad2[4];
 } Shard;
 
 typedef struct FracMesh {
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 58ecb82..8d0a6a9 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -85,6 +85,7 @@
 
 static DerivedMesh* do_prefractured(FractureModifierData *fmd, Object *ob, DerivedMesh *derivedData);
 static void do_prehalving(FractureModifierData *fmd, Object* ob, DerivedMesh* derivedData);
+static Shard* copy_shard(Shard *s);
 
 static FracMesh* copy_fracmesh(FracMesh* fm)
 {
@@ -99,18 +100,7 @@ static FracMesh* copy_fracmesh(FracMesh* fm)
 
 	for (s = fm->shard_map.first; s; s = s->next)
 	{
-		t = BKE_create_fracture_shard(s->mvert, s->mpoly, s->mloop, s->totvert, s->totpoly, s->totloop, true);
-		t->parent_id = s->parent_id;
-		t->shard_id = s->shard_id;
-
-		CustomData_reset(&t->vertData);
-		CustomData_reset(&t->loopData);
-		CustomData_reset(&t->polyData);
-
-		CustomData_add_layer(&t->vertData, CD_MDEFORMVERT, CD_DUPLICATE, CustomData_get_layer(&s->vertData, CD_MDEFORMVERT), s->totvert);
-		CustomData_add_layer(&t->loopData, CD_MLOOPUV, CD_DUPLICATE, CustomData_get_layer(&s->loopData, CD_MLOOPUV), s->totloop);
-		CustomData_add_layer(&t->polyData, CD_MTEXPOLY, CD_DUPLICATE, CustomData_get_layer(&s->polyData, CD_MTEXPOLY), s->totpoly);
-
+		t = copy_shard(s);
 		BLI_addtail(&fmesh->shard_map, t);
 		i++;
 	}
@@ -214,6 +204,7 @@ static void initData(ModifierData *md)
 	fmd->update_dynamic = false;
 	fmd->limit_impact = false;
 	fmd->reset_shards = false;
+	fmd->active_setting = -1;
 }
 
 static void freeMeshIsland(FractureModifierData *rmd, MeshIsland *mi, bool remove_rigidbody)
@@ -1282,7 +1273,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->fracture_mode, fmd->reset_shards, fmd->active_setting);
 		}
 
 		/*TODO, limit this to settings shards !*/
@@ -1513,6 +1504,7 @@ static void do_shard_to_island(FractureModifierData *fmd, BMesh* bm_new)
 		s = BKE_custom_data_to_shard(s, dmtemp);
 		id = BLI_listbase_count(&fmd->islandShards);
 		s->shard_id = id;
+		s->parent_id = -1;
 		BLI_addtail(&fmd->is

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list