[Bf-blender-cvs] [6868e0a7d92] fracture_modifier: crash fix attempts
Martin Felke
noreply at git.blender.org
Wed Feb 14 20:26:16 CET 2018
Commit: 6868e0a7d92c58d4b401b70c534d78c13dbf7631
Author: Martin Felke
Date: Wed Feb 14 20:26:07 2018 +0100
Branches: fracture_modifier
https://developer.blender.org/rB6868e0a7d92c58d4b401b70c534d78c13dbf7631
crash fix attempts
can still crash if you refracture a child object while its attached to others (constraints become invalid)
===================================================================
M source/blender/blenkernel/intern/fracture.c
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/modifiers/intern/MOD_fracture.c
===================================================================
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 61c1d68b5fc..0e80b6a6630 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -93,6 +93,7 @@ static void parse_cell_polys(cell c, MPoly *mpoly, int totpoly, int *r_totloop);
static void parse_cell_loops(cell c, MLoop *mloop, int totloop, MPoly *mpoly, int totpoly);
static void parse_cell_neighbors(cell c, int *neighbors, int totpoly);
static void fracture_collect_layers(Shard *shard, DerivedMesh *result, int vertstart, int polystart, int loopstart, int edgestart);
+static void remove_participants(RigidBodyShardCon *con, MeshIsland *mi);
static void add_shard(FracMesh *fm, Shard *s, float mat[4][4])
{
@@ -2653,6 +2654,9 @@ void BKE_free_constraints(FractureModifierData *fmd)
while (fmd->meshConstraints.first) {
rbsc = fmd->meshConstraints.first;
BLI_remlink(&fmd->meshConstraints, rbsc);
+ remove_participants(rbsc, rbsc->mi1);
+ remove_participants(rbsc, rbsc->mi2);
+
if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC && fmd->modifier.scene)
{
BKE_rigidbody_remove_shard_con(fmd->modifier.scene, rbsc);
@@ -3397,6 +3401,21 @@ void BKE_fracture_free_mesh_island(FractureModifierData *rmd, MeshIsland *mi, bo
}
if (mi->participating_constraints != NULL) {
+ 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;
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 9012b236005..d0e37d7afc9 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -4235,11 +4235,11 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
validOb = validOb || ((mi1 && (mi1->rigidbody->flag & RBO_FLAG_KINEMATIC) == 0)) || ((mi2 && mi2->rigidbody->flag & RBO_FLAG_KINEMATIC) == 0);
validOb = validOb && (check_colgroup_ghost(ob1, ob2) && ((check_constraint_island(fmd1, mi1, mi2) &&
- check_constraint_island(fmd2, mi2, mi1)) || ((ob1 != ob2) && !(fmd1 && fmd2))));
+ check_constraint_island(fmd2, mi2, mi1)) || (ob1 != ob2)));
}
else {
validOb = (check_colgroup_ghost(ob1, ob2) && ((check_constraint_island(fmd1, mi1, mi2) &&
- check_constraint_island(fmd2, mi2, mi1)) || ((ob1 != ob2) && !(fmd1 && fmd2))));
+ check_constraint_island(fmd2, mi2, mi1)) || (ob1 != ob2)));
}
return activate ? validOb : check_activate || validOb;
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 67750157880..bfbd1745326 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -2616,7 +2616,7 @@ static void connect_meshislands(FractureModifierData *fmd, MeshIsland *mi1, Mesh
int i;
for (i = 0; i < mi1->participating_constraint_count; i++) {
con = mi1->participating_constraints[i];
- if ((con->mi1 == mi2) || (con->mi2 == mi2)) {
+ if (con && ((con->mi1 == mi2) || (con->mi2 == mi2))) {
con_found = true;
break;
}
@@ -2625,7 +2625,7 @@ static void connect_meshislands(FractureModifierData *fmd, MeshIsland *mi1, Mesh
if (!con_found) {
for (i = 0; i < mi2->participating_constraint_count; i++) {
con = mi2->participating_constraints[i];
- if ((con->mi1 == mi1) || (con->mi2 == mi1)) {
+ if (con && ((con->mi1 == mi1) || (con->mi2 == mi1))) {
con_found = true;
break;
}
More information about the Bf-blender-cvs
mailing list