[Bf-blender-cvs] [748ada90b5f] fracture_modifier: further constraint related crash fixes

Martin Felke noreply at git.blender.org
Wed Feb 14 21:04:27 CET 2018


Commit: 748ada90b5fb56f9a67a3ab4de76c17f90c98de7
Author: Martin Felke
Date:   Wed Feb 14 21:04:00 2018 +0100
Branches: fracture_modifier
https://developer.blender.org/rB748ada90b5fb56f9a67a3ab4de76c17f90c98de7

further constraint related crash fixes

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

M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/rigidbody.c

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

diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 0e80b6a6630..fd8ef26a6bb 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -2645,6 +2645,22 @@ void BKE_free_constraints(FractureModifierData *fmd)
 
 	for (mi = fmd->meshIslands.first; mi; mi = mi->next) {
 		if (mi->participating_constraints != NULL && mi->participating_constraint_count > 0) {
+			int i = 0;
+
+			for (i = 0; i < mi->participating_constraint_count; i++)
+			{
+				RigidBodyShardCon *con = mi->participating_constraints[i];
+				if (con) {
+					if (con->mi1 == mi) {
+						con->mi1 = NULL;
+					}
+
+					if (con->mi2 == mi) {
+						con->mi2 = NULL;
+					}
+				}
+			}
+
 			MEM_freeN(mi->participating_constraints);
 			mi->participating_constraints = NULL;
 			mi->participating_constraint_count = 0;
@@ -3647,7 +3663,12 @@ static void remove_participants(RigidBodyShardCon* con, MeshIsland *mi)
 	RigidBodyShardCon **cons;
 	/* Probably wrong, would need to shrink array size... listbase would have been better here */
 	/* info not necessary so omit */
-	int count = mi->participating_constraint_count;
+	int count = 0;
+
+	if (!mi)
+		return;
+
+	count = mi->participating_constraint_count;
 
 	if (count > 1)
 	{
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index d0e37d7afc9..454f3f74e73 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2566,7 +2566,10 @@ static bool isModifierActive(FractureModifierData *rmd) {
 static void calc_dist_angle(RigidBodyShardCon *con, float *dist, float *angle, bool exact)
 {
 	float q1[4], q2[4], qdiff[4], axis[3];
-	if ((con->mi1->rigidbody == NULL) || (con->mi2->rigidbody == NULL)) {
+
+	if (con == NULL || con->mi1 == NULL || con->mi2 == NULL ||
+	    con->mi1->rigidbody == NULL || con->mi2->rigidbody == NULL)
+	{
 		*dist = 0;
 		*angle = 0;
 		return;
@@ -5026,11 +5029,17 @@ static void handle_solver_iterations(RigidBodyWorld *rbw, FractureModifierData *
 		iterations = rbw->num_solver_iterations;
 	}
 	else {
-		if ((rbsc->mi1->particle_index != -1) && (rbsc->mi1->particle_index == rbsc->mi2->particle_index)) {
-			iterations = fmd->cluster_solver_iterations_override;
+		if (rbsc && rbsc->mi1 && rbsc->mi2)
+		{
+			if ((rbsc->mi1->particle_index != -1) && (rbsc->mi1->particle_index == rbsc->mi2->particle_index)) {
+				iterations = fmd->cluster_solver_iterations_override;
+			}
+			else {
+				iterations = fmd->solver_iterations_override;
+			}
 		}
 		else {
-			iterations = fmd->solver_iterations_override;
+			iterations = rbw->num_solver_iterations;
 		}
 	}
 
@@ -5171,6 +5180,10 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 
 		for (rbsc = fmd->meshConstraints.first; rbsc; rbsc = rbsc->next) {
 
+			//sanity check
+			if (!rbsc || !rbsc->mi1 || !rbsc->mi2)
+				continue;
+
 			if (rebuild)
 			{
 				rbsc->start_angle = 0.0f;



More information about the Bf-blender-cvs mailing list