[Bf-blender-cvs] [e3bcc2d0d50] temp-fracture-modifier-2.8: dynamic fracture: when using constraints, keep those of unaffected shards in place

Martin Felke noreply at git.blender.org
Tue Nov 27 15:36:54 CET 2018


Commit: e3bcc2d0d5010ea95aa40aac6b8d54f850378740
Author: Martin Felke
Date:   Tue Nov 27 15:35:01 2018 +0100
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rBe3bcc2d0d5010ea95aa40aac6b8d54f850378740

dynamic fracture: when using constraints, keep those of unaffected shards in place

internally all constraints are removed just after bullet step, and rebuilt in modifier
eval call following it, so it will be there on next bullet step. else you mess up the sim
if you stop and restart it.

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

M	source/blender/blenkernel/BKE_fracture.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/fracture_automerge.c
M	source/blender/blenkernel/intern/fracture_constraints.c
M	source/blender/blenkernel/intern/fracture_dynamic.c
M	source/blender/blenkernel/intern/fracture_external.c
M	source/blender/blenkernel/intern/fracture_prefractured.c
M	source/blender/blenkernel/intern/fracture_rigidbody.c
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/makesrna/intern/rna_fracture.c

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

diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index a6e42cdb21a..38acd4abfdd 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -120,7 +120,7 @@ void BKE_fracture_mesh_island_remove(struct FractureModifierData *fmd, struct Sh
 void BKE_fracture_mesh_island_remove_all(struct FractureModifierData *fmd, struct Scene* scene);
 
 void BKE_fracture_mesh_constraint_remove(struct FractureModifierData *fmd, struct RigidBodyShardCon* con, struct Scene *scene);
-void BKE_fracture_constraints_free(struct FractureModifierData *fmd, struct Scene *scene);
+void BKE_fracture_constraints_free(struct FractureModifierData *fmd, struct RigidBodyWorld *rbw);
 
 struct RigidBodyShardCon *BKE_fracture_mesh_constraint_create(struct Scene *scene, struct FractureModifierData *fmd,
                                                      struct Shard *mi1, struct Shard *mi2, short con_type);
@@ -152,7 +152,7 @@ struct Mesh* BKE_fracture_bmesh_to_mesh(struct BMesh* bm);
 
 void BKE_update_velocity_layer(struct FractureModifierData *fmd, struct Mesh *dm);
 bool BKE_rigidbody_remove_modifier(struct RigidBodyWorld* rbw, struct ModifierData *md, struct Object *ob);
-void BKE_fracture_external_constraints_setup(struct FractureModifierData *fmd, struct Scene *scene, struct Object *ob);
+void BKE_fracture_external_constraints_setup(struct FractureModifierData *fmd, struct Scene *scene, struct Object *ob, int frame);
 
 struct Mesh* BKE_fracture_apply(struct FractureModifierData *fmd, struct Object *ob, struct Mesh *me, struct Depsgraph* depsgraph);
 
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 28d7fdc90af..a707c4569b2 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -96,7 +96,7 @@ static void parse_cell_verts(cell c, MVert *mvert, int totvert);
 static void parse_cell_polys(cell c, MPoly *mpoly, int totpoly);
 static void parse_cell_loops(cell c, MLoop *mloop, MPoly *mpoly, int totpoly);
 static void parse_cell_neighbors(cell c, int *neighbors, int totpoly);
-static void do_island_index_map(FractureModifierData *fmd, Object *obj);
+static void do_island_index_map(FractureModifierData *fmd, Object *obj, int frame);
 static void fracture_meshisland_custom(FractureModifierData *fmd, Object *obj, Shard* mii, Scene* scene, int frame, Depsgraph *depsgraph);
 static void intersect_mesh_by_mesh(FractureModifierData* fmd, Object* ob, Mesh* meA, Mesh* meB, Mesh***temp_meshs);
 static void meshisland_inner_vertexgroup_do(FractureModifierData *fmd, Object* ob, Shard* mi);
@@ -557,8 +557,11 @@ static void process_cells(FractureModifierData* fmd, Shard* mii, Object* ob, Sce
 		int k = 0;
 		for (k = 0; k < fmd->shared->last_islands_count; k++)
 		{
-			BLI_remlink(&fmd->shared->shards, fmd->shared->last_islands[k]);
-			BKE_fracture_mesh_island_free(fmd->shared->last_islands[k], scene);
+			if (fmd->shared->last_islands[k])
+			{
+				BLI_remlink(&fmd->shared->shards, fmd->shared->last_islands[k]);
+				BKE_fracture_mesh_island_free(fmd->shared->last_islands[k], scene);
+			}
 		}
 
 		MEM_freeN(fmd->shared->last_islands);
@@ -3156,7 +3159,7 @@ void BKE_fracture_split_islands(FractureModifierData *fmd, Object* ob, Mesh *me,
 	printf("Splitting to islands done, %g \n", PIL_check_seconds_timer() - start);
 }
 
-static void do_island_index_map(FractureModifierData *fmd, Object* obj)
+static void do_island_index_map(FractureModifierData *fmd, Object* obj, int frame)
 {
 	Shard *mi;
 
@@ -3177,6 +3180,11 @@ static void do_island_index_map(FractureModifierData *fmd, Object* obj)
 				if (fmdi)
 				{
 					for (mi = fmdi->shared->shards.first; mi; mi = mi->next){
+
+						if (BKE_fracture_meshisland_check_frame(fmdi, mi, frame)) {
+							continue;
+						}
+
 						for (i = 0; i < mi->mesh->totvert; i++)
 						{
 							if (!BLI_ghash_haskey(fmd->shared->vertex_island_map, POINTER_FROM_INT(i + j)))
@@ -3194,6 +3202,11 @@ static void do_island_index_map(FractureModifierData *fmd, Object* obj)
 	else {
 		int i,j = 0;
 		for (mi = fmd->shared->shards.first; mi; mi = mi->next){
+
+			if (BKE_fracture_meshisland_check_frame(fmd, mi, frame)) {
+				continue;
+			}
+
 			for (i = 0; i < mi->mesh->totvert; i++)
 			{
 				if (!BLI_ghash_haskey(fmd->shared->vertex_island_map, POINTER_FROM_INT(i+j)))
@@ -3256,7 +3269,7 @@ BMesh* BKE_fracture_mesh_to_bmesh(Mesh* me)
 	return bm;
 }
 
-void BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *scene, Object *ob)
+void BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *scene, Object *ob, int frame)
 {
 	if (fmd->shared->flag & (MOD_FRACTURE_REFRESH | MOD_FRACTURE_REFRESH_CONSTRAINTS)) {
 
@@ -3280,7 +3293,7 @@ void BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *s
 							pob = obj;
 
 							fmdi->shared->flag |= MOD_FRACTURE_REFRESH_CONSTRAINTS;
-							BKE_fracture_constraints_free(fmdi, scene);
+							BKE_fracture_constraints_free(fmdi, scene->rigidbody_world);
 							break;
 						}
 					}
@@ -3290,7 +3303,7 @@ void BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *s
 			FOREACH_COLLECTION_OBJECT_RECURSIVE_END;
 		}
 
-		do_island_index_map(fmd, ob);
+		do_island_index_map(fmd, ob, frame);
 		BKE_fracture_constraints_refresh(fmd, ob, scene);
 
 		if (fmd->pack_group && (fmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY))
@@ -3305,7 +3318,7 @@ void BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *s
 
 		if (pfmd && pob) {
 			double start = PIL_check_seconds_timer();
-			do_island_index_map(pfmd, pob);
+			do_island_index_map(pfmd, pob, frame);
 			BKE_fracture_constraints_refresh(pfmd, pob, scene);
 			pfmd->shared->flag &= ~MOD_FRACTURE_REFRESH_CONSTRAINTS;
 			printf("Rebuilding external constraints done, %g\n", PIL_check_seconds_timer() - start);
diff --git a/source/blender/blenkernel/intern/fracture_automerge.c b/source/blender/blenkernel/intern/fracture_automerge.c
index 5aceddf4f6e..ce0b3ae8d1b 100644
--- a/source/blender/blenkernel/intern/fracture_automerge.c
+++ b/source/blender/blenkernel/intern/fracture_automerge.c
@@ -218,29 +218,68 @@ static void find_other_face(FractureModifierData *fmd, int i, BMesh* bm, Object*
 		bool in_filter = false;
 
 		/*filter out face pairs, if we have an autohide filter group */
-		if (fmd->autohide_filter_group){
+		if (fmd->autohide_filter_group)
+		{
 			CollectionObject *go;
-			for (go = fmd->autohide_filter_group->gobject.first; go; go = go->next) {
+			for (go = fmd->autohide_filter_group->gobject.first; go; go = go->next)
+			{
 				/*check location and scale (maximum size if nonuniform) for now */
 				/*if not in any filter range, delete... else keep */
 				Object* obj = go->ob;
 				float f1_loc[3], f2_loc[3];
-				float radius = MAX3(obj->size[0], obj->size[1], obj->size[2]);
+				float radius = 0.1f; //autohide_filter_dist
+				//MAX3(obj->size[0], obj->size[1], obj->size[2]);
 
 				/* TODO XXX watch out if go->ob is parented to ob (Transformation error ?) */
 				mul_v3_m4v3(f1_loc, ob->obmat, f_centr);
 				mul_v3_m4v3(f2_loc, ob->obmat, f_centr_other);
 				radius = radius * radius;
 
-				if ((len_squared_v3v3(f1_loc, obj->loc) < radius) &&
-					(len_squared_v3v3(f2_loc, obj->loc) < radius))
+				if (obj->type == OB_MESH)
 				{
-					in_filter = true;
-					break;
+					/* use geometry of meshes */
+					MVert* mvert = NULL, *mv = NULL;
+					Mesh *dm = obj->runtime.mesh_eval;
+					int totvert, v;
+
+					if (!dm) {
+						dm = obj->data;
+					}
+
+					mvert = dm->mvert;
+					totvert = dm->totvert;
+
+					for (v = 0, mv = mvert; v < totvert; v++, mv++)
+					{
+						float loc[3];
+						mul_v3_m4v3(loc, obj->obmat, mv->co);
+
+						if ((len_squared_v3v3(f1_loc, loc) < radius) &&
+							(len_squared_v3v3(f2_loc, loc) < radius))
+						{
+							in_filter = true;
+							break;
+						}
+						else
+						{
+							in_filter = false;
+						}
+					}
+					if (in_filter) {
+						break;
+					}
 				}
-				else
-				{
-					in_filter = false;
+				else {
+					if ((len_squared_v3v3(f1_loc, obj->loc) < radius) &&
+						(len_squared_v3v3(f2_loc, obj->loc) < radius))
+					{
+						in_filter = true;
+						break;
+					}
+					else
+					{
+						in_filter = false;
+					}
 				}
 			}
 		}
diff --git a/source/blender/blenkernel/intern/fracture_constraints.c b/source/blender/blenkernel/intern/fracture_constraints.c
index 13976a6001a..8c56c36fd1e 100644
--- a/source/blender/blenkernel/intern/fracture_constraints.c
+++ b/source/blender/blenkernel/intern/fracture_constraints.c
@@ -329,29 +329,27 @@ static void search_tree_based(FractureModifierData *rmd, Shard *mi, Shard **mesh
 		if ((mi != mi2) && (mi2 != NULL)) {
 			float thresh = rmd->breaking_threshold;
 			int con_type = rmd->constraint_type;
+			int startframe = 1;
 
 			if ((i >= limit) && (limit > 0)) {
 				break;
 			}
 
-			if (rmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY)
-			{
-				int startframe = 1;
-				if (scene->rigidbody_world) {
-					startframe = scene->rigidbody_world->shared->pointcache->startframe;
-				}
-				if (rmd->dynamic_new_constraints == MOD_FRACTURE_MIXED_DYNAMIC_CONSTRAINTS) {
-					//only build between old and new (old = mi startframe == pointcache startframe)
-					if (mi->startframe > startframe && mi2->startframe > startframe) {
-						continue;
-					}
+			if (scene->rigidbody_world) {
+				startframe = scene->rigidbody_world->shared->pointcache->startframe;
+			}
+
+			if (rmd->dynamic_new_constraints == MOD_FRACTURE_MIXED_DYNAMIC_CONSTRAINTS) {
+				//only build between old and new (old = mi startframe == pointcache startframe)
+				if (mi->startframe > startframe && mi2->startframe > startframe) {
+					continue;
 				}
+			}
 
-				if (rmd->dynamic_new_constraints == MOD_FRACTURE_NO_DYNAMIC_CONSTRAINTS)
-				{	//only build between old
-					if (mi->startframe > startframe || mi2->startframe > startframe) {
-						continue;
-					}
+			if (rmd->dynamic_new_constraints == MOD_FRACTURE_NO_DYNAMIC_CONSTRAINTS)
+			{	//only build between old
+				if (

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list