[Bf-blender-cvs] [40794110d43] temp-fracture-modifier-2.8: fix for external constraints (centroid)

Martin Felke noreply at git.blender.org
Sun Dec 2 13:40:09 CET 2018


Commit: 40794110d4374c5e7ec4dafff5162f8558a68191
Author: Martin Felke
Date:   Sun Dec 2 13:38:27 2018 +0100
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rB40794110d4374c5e7ec4dafff5162f8558a68191

fix for external constraints (centroid)

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

M	source/blender/blenkernel/BKE_fracture.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/fracture_constraints.c
M	source/blender/blenkernel/intern/fracture_prefractured.c

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

diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index 7e6074b6f92..5d793f25753 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -186,4 +186,7 @@ bool BKE_fracture_handle_initial_shards(struct FractureModifierData* fmd, struct
                                         struct Depsgraph *depsgraph, struct Main* bmain,
                                         struct Scene* scene, int frame);
 
+void BKE_fracture_meshislands_connect(struct Scene* scene, struct FractureModifierData* fmd,
+                                      struct Shard* mi, struct Shard* mi2, short con_type, float thresh);
+
 #endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 70e14288914..ab76b03a687 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -1320,7 +1320,7 @@ Mesh* BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, Object*
 		}
 
 		if (dupli) {
-			if (!BLI_ghash_lookup(fmd->shared->dupli_shard_map, mi->id))
+			if (!BLI_ghash_lookup(fmd->shared->dupli_shard_map, POINTER_FROM_INT(mi->id)))
 			{
 				continue;
 			}
@@ -1894,7 +1894,8 @@ void BKE_fracture_meshislands_free(FractureModifierData* fmd, Scene* scene)
 
 void BKE_fracture_modifier_free(FractureModifierData *fmd, Scene *scene)
 {
-	BKE_fracture_constraints_free(fmd, scene);
+	if (scene && scene->rigidbody_world)
+		BKE_fracture_constraints_free(fmd, scene->rigidbody_world);
 	BKE_fracture_meshislands_free(fmd, scene);
 
 	if (fmd->shared->material_index_map)
@@ -3325,7 +3326,7 @@ void BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *s
 				FractureModifierData *fmdi = (FractureModifierData*)modifiers_findByType(obj, eModifierType_Fracture);
 				if (fmdi && fmdi->pack_group && (fmdi->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY))
 				{
-					FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(fmd->pack_group, obb)
+					FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(fmdi->pack_group, obb)
 					{
 						if (obb == ob)
 						{
@@ -3349,8 +3350,11 @@ void BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *s
 		if (fmd->pack_group && (fmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY))
 		{	//disable the carrier object, it would interfere (it should have 1 island only)
 			Shard *mi = fmd->shared->shards.first;
-			mi->rigidbody->flag |= RBO_FLAG_KINEMATIC;
-			mi->rigidbody->flag |= RBO_FLAG_IS_GHOST;
+			if (mi && mi->rigidbody)
+			{
+				mi->rigidbody->flag |= RBO_FLAG_KINEMATIC;
+				mi->rigidbody->flag |= RBO_FLAG_IS_GHOST;
+			}
 
 			ob->rigidbody_object->flag |= RBO_FLAG_KINEMATIC;
 			ob->rigidbody_object->flag |= RBO_FLAG_IS_GHOST;
@@ -3369,7 +3373,7 @@ void BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *s
 void BKE_fracture_meshislands_pack(FractureModifierData *fmd, Object* obj, Main* bmain, Scene* scene)
 {
 	int i = 0;
-	if (fmd->pack_group)
+	if (fmd->pack_group && !(fmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY))
 	{
 		BKE_fracture_mesh_island_remove_all(fmd, scene);
 
diff --git a/source/blender/blenkernel/intern/fracture_constraints.c b/source/blender/blenkernel/intern/fracture_constraints.c
index 8c56c36fd1e..ec707eb086c 100644
--- a/source/blender/blenkernel/intern/fracture_constraints.c
+++ b/source/blender/blenkernel/intern/fracture_constraints.c
@@ -173,7 +173,19 @@ static int prepareConstraintSearch(FractureModifierData *rmd, Shard ***mesh_isla
 		*combined_tree = BLI_kdtree_new(islands);
 		for (i = 0; i < islands; i++) {
 			float obj_centr[3];
-			mul_v3_m4v3(obj_centr, obj->obmat, (*mesh_islands)[i]->loc);
+			if (!(rmd->pack_group && (rmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY)))
+			{
+				mul_v3_m4v3(obj_centr, obj->obmat, (*mesh_islands)[i]->loc);
+			}
+			else {
+				//TODO, take care of recursive collections here !!!!
+				CollectionObject *go = BLI_findlink(&scene->rigidbody_world->group->gobject,
+				                                    (*mesh_islands)[i]->object_index);
+
+				mul_v3_m4v3(obj_centr, go->ob->obmat, (*mesh_islands)[i]->loc);
+				//copy_v3_v3(obj_centr, (*mesh_islands)[i]->loc);
+			}
+
 			BLI_kdtree_insert(*combined_tree, i, obj_centr);
 		}
 
@@ -224,7 +236,6 @@ static int prepareConstraintSearch(FractureModifierData *rmd, Shard ***mesh_isla
 
 		if (totvert > 0)
 		{
-
 			*combined_tree = BLI_kdtree_new(totvert);
 			for (i = 0, mv = mvert; i < totvert; i++, mv++) {
 				float co[3];
@@ -267,7 +278,17 @@ static void create_constraints(FractureModifierData *rmd, Object *ob, Scene *sce
 
 	for (i = 0; i < count; i++) {
 		if (rmd->constraint_target == MOD_FRACTURE_CENTROID) {
-			search_tree_based(rmd, mesh_islands[i], mesh_islands, &coord_tree, NULL, ob, scene);
+			float co[3];
+			if (rmd->pack_group && (rmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY))
+			{
+				CollectionObject *go = BLI_findlink(&scene->rigidbody_world->group->gobject, mesh_islands[i]->object_index);
+				mul_v3_m4v3(co, go->ob->obmat, mesh_islands[i]->loc);
+			}
+			else {
+				copy_v3_v3(co, mesh_islands[i]->loc);
+			}
+
+			search_tree_based(rmd, mesh_islands[i], mesh_islands, &coord_tree, co, ob, scene);
 		}
 		else if (rmd->constraint_target == MOD_FRACTURE_VERTEX) {
 			Shard *mii = NULL;
@@ -298,19 +319,13 @@ static void search_tree_based(FractureModifierData *rmd, Shard *mi, Shard **mesh
 
 	limit = rmd->constraint_limit;
 	dist = rmd->contact_dist;
-	//factor = rmd->mass_threshold_factor;
 
-	if (rmd->constraint_target == MOD_FRACTURE_CENTROID) {
-		mul_v3_m4v3(obj_centr, ob->obmat, mi->loc);
+	if (!(rmd->pack_group && (rmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY)))
+	{
+		mul_v3_m4v3(obj_centr, ob->obmat, co);
 	}
-	else if (rmd->constraint_target == MOD_FRACTURE_VERTEX){
-		if (!(rmd->pack_group && (rmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY)))
-		{
-			mul_v3_m4v3(obj_centr, ob->obmat, co);
-		}
-		else {
-			copy_v3_v3(obj_centr, co);
-		}
+	else {
+		copy_v3_v3(obj_centr, co);
 	}
 
 	r = BLI_kdtree_range_search(*combined_tree, obj_centr, &n3, dist);
@@ -362,7 +377,8 @@ static void search_tree_based(FractureModifierData *rmd, Shard *mi, Shard **mesh
 				}
 			}
 
-			BKE_fracture_constraint_create(scene, rmd, mi, mi2, con_type, thresh);
+			/* does some more checks */
+			BKE_fracture_meshislands_connect(scene, rmd, mi, mi2, con_type, thresh);
 		}
 	}
 
@@ -373,7 +389,7 @@ static void search_tree_based(FractureModifierData *rmd, Shard *mi, Shard **mesh
 }
 
 void BKE_fracture_meshislands_connect(Scene* sc, FractureModifierData *fmd, Shard *mi1, Shard *mi2,
-											 int con_type, float thresh)
+											 short con_type, float thresh)
 {
 	int con_found = false;
 	RigidBodyShardCon *con;
@@ -407,7 +423,7 @@ void BKE_fracture_meshislands_connect(Scene* sc, FractureModifierData *fmd, Shar
 	}
 
 	if (!con_found && ok) {
-		BKE_fracture_meshislands_connect(sc, fmd, mi1, mi2, con_type, thresh);
+		BKE_fracture_constraint_create(sc, fmd, mi1, mi2, con_type, thresh);
 	}
 }
 
@@ -658,6 +674,7 @@ static void do_clusters(FractureModifierData *fmd, Object* obj)
 	do_cluster_count(fmd, obj);
 }
 
+/* used for external python api */
 RigidBodyShardCon *BKE_fracture_mesh_constraint_create(Scene *scene, FractureModifierData *fmd,
 													 Shard *mi1, Shard *mi2, short con_type)
 {
diff --git a/source/blender/blenkernel/intern/fracture_prefractured.c b/source/blender/blenkernel/intern/fracture_prefractured.c
index 67aa21e57fe..5fde2845dd8 100644
--- a/source/blender/blenkernel/intern/fracture_prefractured.c
+++ b/source/blender/blenkernel/intern/fracture_prefractured.c
@@ -228,12 +228,15 @@ Mesh* BKE_fracture_apply(FractureModifierData *fmd, Object *ob, Mesh *me_orig, D
 		/*keep shards at packing and at dynamic refresh */
 		if (fmd->pack_group)
 		{
-			/* keep re-packing, too */
-			BKE_fracture_meshislands_pack(fmd, ob, bmain, scene);
-
-			if (!BKE_fracture_handle_initial_shards(fmd, ob, depsgraph, bmain, scene, frame))
+			if (!(fmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY))
 			{
-				do_initial_prefracture(fmd, ob, depsgraph, bmain, scene, frame, me);
+				/* keep re-packing, too */
+				BKE_fracture_meshislands_pack(fmd, ob, bmain, scene);
+
+				if (!BKE_fracture_handle_initial_shards(fmd, ob, depsgraph, bmain, scene, frame))
+				{
+					do_initial_prefracture(fmd, ob, depsgraph, bmain, scene, frame, me);
+				}
 			}
 		}
 		else {
@@ -267,7 +270,7 @@ Mesh* BKE_fracture_apply(FractureModifierData *fmd, Object *ob, Mesh *me_orig, D
 	}
 
 	/* assemble mesh from transformed meshislands */
-	if (fmd->shared->shards.first) {
+	if (fmd->shared->shards.first && !(fmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY)) {
 		me_assembled = BKE_fracture_assemble_mesh_from_islands(fmd, ob, ctime);
 	}
 	else {



More information about the Bf-blender-cvs mailing list