[Bf-blender-cvs] [e0fdc82] fracture_modifier: experimental new feature: multiple fracture setting per predefined mesh island, delimited by a vertexgroup per island

Martin Felke noreply at git.blender.org
Fri Oct 16 21:14:48 CEST 2015


Commit: e0fdc8279c6cd46221ce38c423e29e346c974e7b
Author: Martin Felke
Date:   Fri Oct 16 20:48:15 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rBe0fdc8279c6cd46221ce38c423e29e346c974e7b

experimental new feature: multiple fracture setting per predefined mesh island, delimited by a vertexgroup per island

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

M	release/scripts/startup/bl_ui/properties_physics_fracture.py
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_modifier_types.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py b/release/scripts/startup/bl_ui/properties_physics_fracture.py
index a6bc298..eba6712 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -40,7 +40,7 @@ class PhysicButtonsPanel():
         rd = context.scene.render
         return (ob and (ob.type == 'MESH' or ob.type == 'CURVE' or ob.type == 'SURFACE' or ob.type == 'FONT')) and (not rd.use_game_engine) and (context.fracture)
 
-class FRACTURE_UL_fracture_levels(UIList):
+class FRACTURE_UL_fracture_settings(UIList):
     def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
         fl = item
         if self.layout_type in {'DEFAULT', 'COMPACT'}:
@@ -49,9 +49,18 @@ class FRACTURE_UL_fracture_levels(UIList):
             layout.alignment = 'CENTER'
             layout.label(text="", icon_value=icon)
 
-class PHYSICS_PT_fracture(PhysicButtonsPanel, Panel):
+class PHYSICS_PT_fracture_settings(PhysicButtonsPanel, Panel):
     bl_label = "Fracture Settings"
 
+    def draw(self, context):
+       layout = self.layout
+       md = context.fracture
+
+       layout.template_list("FRACTURE_UL_fracture_settings", "", md, "fracture_settings", md, "active_setting", rows=3)
+
+class PHYSICS_PT_fracture(PhysicButtonsPanel, Panel):
+    bl_label = "Active Fracture Settings"
+
     def icon(self, bool):
         if bool:
             return 'TRIA_DOWN'
diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index 3f19d29..418b583 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -38,6 +38,7 @@ struct FracMesh;
 struct Shard;
 
 struct FractureModifierData;
+struct FractureSetting;
 struct DerivedMesh;
 struct Object;
 struct Group;
@@ -63,7 +64,7 @@ typedef struct FracPointCloud {
 struct Shard *BKE_shard_by_id(struct FracMesh *mesh, ShardID id, struct DerivedMesh *dm);
 
 /* detailed info to the particular shards */
-void BKE_get_shard_minmax(struct FracMesh *mesh, ShardID id, float min_r[3], float max_r[3], struct DerivedMesh *dm);
+bool BKE_get_shard_minmax(struct FracMesh *mesh, ShardID id, float min_r[3], float max_r[3], struct DerivedMesh *dm);
 
 /* container object handling functions */
 struct FracMesh *BKE_create_fracture_container(void);
@@ -97,5 +98,8 @@ bool BKE_lookup_mesh_state(struct FractureModifierData *fmd, int frame, int do_l
 void BKE_get_prev_entries(struct FractureModifierData *fmd);
 void BKE_get_next_entries(struct FractureModifierData *fmd);
 void BKE_free_constraints(struct FractureModifierData *fmd);
+void BKE_fracture_load_settings(struct FractureModifierData *fmd, struct FractureSetting *fs);
+void BKE_fracture_store_settings(struct FractureModifierData *fs, struct FractureSetting *fmd);
+struct Shard* BKE_create_initial_shard(struct DerivedMesh *dm);
 
 #endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index ddaafcc..1b6a763 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -279,6 +279,17 @@ float BKE_shard_calc_minmax(Shard *shard)
 	return len_v3(diff);
 }
 
+Shard* BKE_create_initial_shard(DerivedMesh *dm)
+{
+	/* create temporary shard covering the entire mesh */
+	Shard *s = BKE_create_fracture_shard(dm->getVertArray(dm), dm->getPolyArray(dm), dm->getLoopArray(dm),
+	                                     dm->numVertData, dm->numPolyData, dm->numLoopData, true);
+	s = BKE_custom_data_to_shard(s, dm);
+	s->flag = SHARD_INTACT;
+	s->shard_id = -2;
+	return s;
+}
+
 
 /*access shard directly by index / id*/
 Shard *BKE_shard_by_id(FracMesh *mesh, ShardID id, DerivedMesh *dm) {
@@ -300,18 +311,13 @@ Shard *BKE_shard_by_id(FracMesh *mesh, ShardID id, DerivedMesh *dm) {
 	else if (id == -1 && dm != NULL)
 	{
 		/* create temporary shard covering the entire mesh */
-		Shard *s = BKE_create_fracture_shard(dm->getVertArray(dm), dm->getPolyArray(dm), dm->getLoopArray(dm),
-		                                     dm->numVertData, dm->numPolyData, dm->numLoopData, true);
-		s = BKE_custom_data_to_shard(s, dm);
-		s->flag = SHARD_INTACT;
-		s->shard_id = -2;
-		return s;
+		return BKE_create_initial_shard(dm);
 	}
 	
 	return NULL;
 }
 
-void BKE_get_shard_minmax(FracMesh *mesh, ShardID id, float min_r[3], float max_r[3], DerivedMesh *dm)
+bool BKE_get_shard_minmax(FracMesh *mesh, ShardID id, float min_r[3], float max_r[3], DerivedMesh *dm)
 {
 	Shard *shard = BKE_shard_by_id(mesh, id, dm);
 	if (shard != NULL) {
@@ -323,11 +329,10 @@ void BKE_get_shard_minmax(FracMesh *mesh, ShardID id, float min_r[3], float max_
 		{
 			BKE_shard_free(shard, true);
 		}
+
+		return true;
 	}
-	else
-	{
-		printf("OOOOPS: %d is NULL!!!\n", id);
-	}
+	return false;
 }
 
 Shard *BKE_create_fracture_shard(MVert *mvert, MPoly *mpoly, MLoop *mloop, int totvert, int totpoly, int totloop, bool copy)
@@ -726,11 +731,18 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int
 		if (deletemap[i] && fm->last_shards)
 		{
 			Shard *t = fm->last_shards[i];
-			BLI_remlink_safe(&fm->shard_map, t);
-			BKE_shard_free(t, true);
-			fm->last_shards[i] = NULL;
 
-			printf("Deleting shard: %d\n", i);
+			if (t->parent_id == p->shard_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);
+			}
 		}
 	}
 
@@ -742,7 +754,9 @@ 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)
+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)
 {
 	/*Parse voronoi raw data*/
 	int i = 0, j = 0, count = 0;
@@ -819,6 +833,8 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra
 			{
 				BLI_kdtree_balance(fm->last_shard_tree);
 			}
+
+			p->flag |= SHARD_DELETE;
 		}
 	}
 	else
@@ -902,7 +918,8 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra
 	}
 
 
-	if (p->shard_id == -2)
+	//if (p->shard_id == -2)
+	if (p && parent_id == -2)
 	{
 		BKE_shard_free(p, true);
 	}
@@ -1001,7 +1018,7 @@ static Shard *parse_cell(cell c)
 
 	s = BKE_create_fracture_shard(mvert, mpoly, mloop, totvert, totpoly, totloop, false);
 
-	s->flag &= ~(SHARD_SKIP | SHARD_DELETE);
+	//s->flag &= ~(SHARD_SKIP | SHARD_DELETE);
 	s->neighbor_ids = neighbors;
 	s->neighbor_count = totpoly;
 	copy_v3_v3(s->centroid, centr);
@@ -1440,7 +1457,9 @@ 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) {
+                                  inner_material_index, float mat[4][4], int num_cuts, float fractal, bool smooth, int num_levels, int mode,
+                                  bool reset)
+{
 	int n_size = 8;
 	
 	Shard *shard;
@@ -1458,8 +1477,17 @@ 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)
-		return;
+	if (!shard || shard->flag & SHARD_FRACTURED) {
+		if (id == 0)
+		{
+			//fallback to entire mesh
+			shard = BKE_shard_by_id(fmesh, -1 , dm);
+		}
+		else
+		{
+			return;
+		}
+	}
 
 	printf("Fracturing with %d points...\n", pointcloud->totpoints);
 	/* calculate bounding box with theta margin */
@@ -1943,3 +1971,134 @@ void BKE_free_constraints(FractureModifierData *fmd)
 	fmd->meshConstraints.first = NULL;
 	fmd->meshConstraints.last = NULL;
 }
+
+void BKE_fracture_load_settings(FractureModifierData *fmd, FractureSetting *fs)
+{
+	/*copy settings values to FM itself....*/
+
+	/* vgroups  XXX TODO non ascii strings ?*/
+	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));
+
+	fmd->inner_material = fs->inner_material;
+	fmd->extra_group = fs->extra_group;
+	fmd->cluster_group = fs->cluster_group;
+	fmd->cutter_group = fs->cutter_group;
+
+	fmd->breaking_threshold = fs->breaking_threshold;
+	fmd->use_constraints = fs->use_constraints;
+	fmd->contact_dist = fs->contact_dist;
+	fmd->use_mass_dependent_thresholds = fs->use_mass_dependent_thresholds;
+
+	fmd->constraint_limit = fs->constraint_limit;
+	fmd->breaking_angle = fs->breaking_angle;
+	fmd->breaking_distance = fs->breaking_distance;
+	fmd->breaking_percentage = fs->breaking_percentage;
+	fmd->use_experimental = fs->use_experimental;
+
+	fmd->cluster_count = fs->cluster_count;
+	fmd->cluster_breaking_threshold = fs->cluster_breaking_threshold;
+	fmd->solver_iterations_override = fs->solver_iterations_override;
+	fmd->shards_to_islands = fs->shards_to_islands;
+
+	fmd->shard_count = fs->shard_count;
+	fmd->frac_algorithm = fs->frac_algorithm;
+
+	fmd->solver_iterations_override = fs->solver_iterations_override;
+
+	fmd->breaking_angle_weighted = fs->breaking_angle_weighted;
+	fmd->breaking_distance_weighted = fs->breaking_distance_weighted;
+	fmd->breaking_percentage_weighted = fs->breaking_percentage_weighted;
+
+	fmd->point_seed = fs->point_seed;
+	fmd->point_source = fs->point_source;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list