[Bf-blender-cvs] [e90424544ae] temp-fracture-modifier-2.8: added new cluster trigger propagation feature and a couple of fixes

Martin Felke noreply at git.blender.org
Sat Dec 8 20:13:30 CET 2018


Commit: e90424544aecf7d009a17576a1be26d2903ac412
Author: Martin Felke
Date:   Sat Dec 8 20:13:10 2018 +0100
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rBe90424544aecf7d009a17576a1be26d2903ac412

added new cluster trigger propagation feature and a couple of fixes

fixes for example for split to island crashs

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

M	source/blender/blenkernel/BKE_fracture.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/fracture_prefractured.c
M	source/blender/blenkernel/intern/fracture_rigidbody.c
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc

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

diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index 5d793f25753..f6ebc0a4540 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -171,12 +171,13 @@ void BKE_fracture_meshisland_vertexgroups_do(struct FractureModifierData *fmd, s
 void BKE_fracture_meshislands_pack(struct FractureModifierData *fmd, struct Object* obj, struct Main* bmain, struct Scene* scene);
 
 void BKE_fracture_postprocess_meshisland(struct FractureModifierData *fmd, struct Object* ob, struct Shard* mi,
-                                         struct Mesh** temp_meshs, int count, struct Scene* scene, int frame, struct Shard **shards);
+                                         struct Mesh ***temp_meshs, int count, struct Scene* scene, int frame,
+                                         struct Shard **shards);
 
 void BKE_fracture_meshisland_normals_fix(struct FractureModifierData *fmd, struct Shard* mi, struct Mesh* orig_me);
 
-void BKE_fracture_copy_customdata(struct CustomData* src, struct CustomData* dst, CustomDataMask mask, int src_ofs, int dst_ofs,
-                              int copyelem, int totelem);
+void BKE_fracture_copy_customdata(struct CustomData* src, struct CustomData* dst, CustomDataMask mask, int src_ofs,
+                                  int dst_ofs, int copyelem, int totelem);
 
 bool BKE_fracture_check_valid_shard(struct FractureModifierData *fmd, struct Shard *mi, struct Scene *scene);
 void BKE_fracture_duplis_to_shards(struct FractureModifierData *fmd, struct Object *ob, struct Scene *scene,
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 5d3792ab11d..3a4223d0c49 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -214,8 +214,9 @@ bool BKE_fracture_mesh_center_centroid_area(Mesh *shard, float cent[3])
 
 static void init_random(FractureModifierData *fmd) {
 	/* Random generator, only init once. */
-	uint rng_seed = (uint)(PIL_check_seconds_timer_i() & UINT_MAX);
-	rng_seed ^= POINTER_AS_UINT(fmd);
+	//uint rng_seed = (uint)(PIL_check_seconds_timer_i() & UINT_MAX);
+	//rng_seed ^= POINTER_AS_UINT(fmd);
+	uint rng_seed = (unsigned int)fmd->point_seed;
 	fmd->shared->rng = BLI_rng_new(rng_seed);
 }
 
@@ -541,7 +542,7 @@ static void process_cells(FractureModifierData* fmd, Shard* mii, Object* ob, Sce
 		}
 	}
 
-	BKE_fracture_postprocess_meshisland(fmd, ob, mii, temp_meshs, count, scene, frame, islands);
+	BKE_fracture_postprocess_meshisland(fmd, ob, mii, &temp_meshs, count, scene, frame, islands);
 
 	BLI_kdtree_balance(tree);
 
@@ -876,25 +877,34 @@ static void intersect_mesh_by_mesh(FractureModifierData* fmd, Object* ob, Mesh*
 	}
 }
 
-void BKE_fracture_postprocess_meshisland(FractureModifierData *fmd, Object* ob, Shard* mi, Mesh** temp_meshs, int count,
+void BKE_fracture_postprocess_meshisland(FractureModifierData *fmd, Object* ob, Shard* mi, Mesh*** temp_meshs, int count,
 										 Scene* scene, int frame, Shard** shards)
 {
 	int count_new = count+1;
-	int j = 1, i = 0;
+	int j = 1, i = 0, k = 0;
 	float size[3];
+	bool* deletemap = MEM_callocN(sizeof(bool) * count_new, "deletemap");
 	mat4_to_size(size, ob->obmat);
 
 	if (fmd->flag & MOD_FRACTURE_USE_SPLIT_TO_ISLANDS)
 	{
 		for (i = 0; i < count+1; i++)
 		{
-			if (temp_meshs[i]) {
+			if ((*temp_meshs)[i] && !deletemap[i]) {
 				int oldcount = count_new;
 				double start = PIL_check_seconds_timer();
 
-				BKE_fracture_split_islands(fmd, ob, temp_meshs[i], &temp_meshs, &count_new );
-				BKE_fracture_mesh_free(temp_meshs[i]);
-				temp_meshs[i] = NULL;
+				BKE_fracture_split_islands(fmd, ob, (*temp_meshs)[i], temp_meshs, &count_new );
+				//BKE_fracture_mesh_free((*temp_meshs)[i]);
+				//(*temp_meshs)[i] = NULL;
+				deletemap[i] = true;
+
+				//expand deletemap, too since the tempmesh array grows and deletemap[i] might point "somewhere" then
+				//giving garbage values
+				deletemap = MEM_reallocN(deletemap, sizeof(bool) * count_new);
+				for (k = oldcount; k < count_new; k++) {
+					deletemap[k] = false;
+				}
 
 				if ((i < count) && shards && shards[i]) {
 					//flag as being freed, set null here ! so no other free attempt happens
@@ -908,12 +918,12 @@ void BKE_fracture_postprocess_meshisland(FractureModifierData *fmd, Object* ob,
 
 	for (i = 0; i < count_new; i++)
 	{
-		if (temp_meshs[i])
+		if ((*temp_meshs)[i] && !deletemap[i])
 		{
-			if (temp_meshs[i]->totvert > 0)
+			if (((*temp_meshs)[i]->totvert > 0))
 			{	/* skip invalid cells, e.g. those which are eliminated by bisect */
 				float loc[3], rot[4], qrot[4], centr[3];
-				Shard *result = BKE_fracture_mesh_island_create(temp_meshs[i], scene, ob, frame);
+				Shard *result = BKE_fracture_mesh_island_create((*temp_meshs)[i], scene, ob, frame);
 
 				fracture_meshisland_add(fmd, result);
 				result->id = mi->id + j;
@@ -957,8 +967,7 @@ void BKE_fracture_postprocess_meshisland(FractureModifierData *fmd, Object* ob,
 
 				//validate already here at once... dynamic somehow doesnt get updated else
 				//BKE_rigidbody_shard_validate(scene->rigidbody_world, result, ob, fmd, true,
-				//							 true, size, frame);
-
+				//								 true, size, frame);
 
 				// try with delayed validation; next frame before next bullet step from rigidbody depsgraph eval thread
 				if (!(result->rigidbody->flag & RBO_FLAG_KINEMATIC))
@@ -976,10 +985,17 @@ void BKE_fracture_postprocess_meshisland(FractureModifierData *fmd, Object* ob,
 				j++;
 			}
 			else {
-				BKE_fracture_mesh_free(temp_meshs[i]);
+				BKE_fracture_mesh_free((*temp_meshs)[i]);
+				(*temp_meshs)[i] = NULL;
 			}
 		}
+		else if ((*temp_meshs)[i]) {
+			BKE_fracture_mesh_free((*temp_meshs)[i]);
+			(*temp_meshs)[i] = NULL;
+		}
 	}
+
+	MEM_freeN(deletemap);
 }
 
 static Shard* fracture_cutter_process(FractureModifierData* fmd, Object *obA, Mesh* meA, Object* obB,
@@ -1017,7 +1033,7 @@ static Shard* fracture_cutter_process(FractureModifierData* fmd, Object *obA, Me
 		temp_meshs[1] = NULL;
 	}
 
-	BKE_fracture_postprocess_meshisland(fmd, obB, miB, temp_meshs, 2, scene, frame, NULL);
+	BKE_fracture_postprocess_meshisland(fmd, obB, miB, &temp_meshs, 2, scene, frame, NULL);
 
 	MEM_freeN(temp_meshs);
 
@@ -1251,6 +1267,15 @@ void BKE_fracture_clear_cache(FractureModifierData* fmd, Scene *scene)
 	Shard *mi, *next;
 	bool dynamic = false;
 
+	if (fmd->flag & MOD_FRACTURE_USE_DUPLI)
+	{
+		BKE_fracture_meshislands_free(fmd, scene);
+		if (fmd->shared->dupli_shard_map) {
+			BLI_ghash_free(fmd->shared->dupli_shard_map, NULL, NULL);
+				fmd->shared->dupli_shard_map = NULL;
+		}
+	}
+
 	BLI_listbase_clear(&fmd->shared->dynamic_fracture_queue);
 
 	if (rbw && rbw->shared) {
@@ -3356,8 +3381,11 @@ void BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *s
 				mi->rigidbody->flag |= RBO_FLAG_IS_GHOST;
 			}
 
-			ob->rigidbody_object->flag |= RBO_FLAG_KINEMATIC;
-			ob->rigidbody_object->flag |= RBO_FLAG_IS_GHOST;
+			if (ob->rigidbody_object)
+			{
+				ob->rigidbody_object->flag |= RBO_FLAG_KINEMATIC;
+				ob->rigidbody_object->flag |= RBO_FLAG_IS_GHOST;
+			}
 		}
 
 		if (pfmd && pob) {
diff --git a/source/blender/blenkernel/intern/fracture_prefractured.c b/source/blender/blenkernel/intern/fracture_prefractured.c
index b828e171cbc..dc9890ddac6 100644
--- a/source/blender/blenkernel/intern/fracture_prefractured.c
+++ b/source/blender/blenkernel/intern/fracture_prefractured.c
@@ -80,7 +80,7 @@ Shard *BKE_fracture_mesh_island_create(Mesh* me, Scene *scene, Object *ob, int f
 	}
 
 	mi->rigidbody = BKE_rigidbody_create_shard(ob, NULL, mi, scene);
-	mi->rigidbody->type = RBO_TYPE_ACTIVE;
+	mi->rigidbody->type = ob->rigidbody_object->type; //RBO_TYPE_ACTIVE;
 	mi->rigidbody->flag = ob->rigidbody_object->flag;
 	mi->rigidbody->flag |= RBO_FLAG_NEEDS_VALIDATE;
 	mi->rigidbody->flag |= RBO_FLAG_NEEDS_RESHAPE;
diff --git a/source/blender/blenkernel/intern/fracture_rigidbody.c b/source/blender/blenkernel/intern/fracture_rigidbody.c
index f22b113c75b..6ecd0808e38 100644
--- a/source/blender/blenkernel/intern/fracture_rigidbody.c
+++ b/source/blender/blenkernel/intern/fracture_rigidbody.c
@@ -74,6 +74,8 @@
 static void check_fracture(rbContactPoint *cp, Scene *scene);
 static void test_deactivate_rigidbody(RigidBodyOb *rbo, Shard *mi);
 static float box_volume(float size[3]);
+bool check_cluster_propagate(FractureModifierData *fmd1, FractureModifierData *fmd2,
+                             Object *ob1, Object* ob2, Shard *mi1, Shard *mi2);
 
 
 void BKE_rigidbody_activate(RigidBodyOb* rbo, RigidBodyWorld *UNUSED(rbw), Shard *mi, Object *ob)
@@ -799,7 +801,7 @@ static void rigidbody_create_shard_physics_constraint(FractureModifierData* fmd,
 	rbRigidBody *rb1;
 	rbRigidBody *rb2;
 
-	if (rbc && rbc->mi1 && rbc->mi2)
+	if (rbc && rbc->mi1 && rbc->mi2 && rbc->mi1->rigidbody && rbc->mi2->rigidbody)
 	{
 		rb1 = rbc->mi1->rigidbody->shared->physics_object;
 		rb2 = rbc->mi2->rigidbody->shared->physics_object;
@@ -1033,19 +1035,22 @@ static bool colgroup_check(int group1, int group2)
 
 static bool do_activate(Object* ob, Object *ob2, Shard *mi_compare, RigidBodyWorld *rbw, Shard *mi_trigger, bool activate)
 {
-	FractureModifierData *fmd;
+	FractureModifierData *fmd, *fmd2;
 	bool valid = true;
 	bool antiValid = ob2->rigidbody_object->flag & RBO_FLAG_ANTI_TRIGGER;
 	bool wouldActivate = false;
 	Shard *mi;
 
 	fmd = (FractureModifierData*)modifiers_findByType(ob, eModifierType_Fracture);
+	fmd2 = (FractureModifierData*)modifiers_findByType(ob2, eModifierType_Fracture);
+
 	valid = valid && (fmd != NULL);
 	antiValid = antiValid && (fmd != NULL);
 
 	valid = valid && (ob->rigidbody_object->flag & RBO_FLAG_IS_TRIGGERED);
-	valid = valid && ((ob2->rigidbody_object->flag & RBO_FLAG_IS_TRIGGER) || ((ob2->rigidbody_object->flag & RBO_FLAG_PROPAGATE_TRIGGER) &&
-			((mi_trigger) && (mi_trigger->rigidbody->flag & RBO_FLAG_PROPAGATE_TRIGGER))));
+	valid = valid && ((ob2->rigidbody_object->flag & RBO_FLAG_IS_TRIGGER) ||
+	        ((ob2->rigidbody_object->flag & RBO_FLAG_PROPAGATE_TRIGGER) &&
+	        ((mi_trigger) && (mi_trigger->rigidbody->flag & R

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list