From 1c8a33ab92ce8935165be29d2fc93e459c191286 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20T=C3=B6nne?= Date: Fri, 12 Sep 2014 16:46:47 +0200 Subject: [PATCH] Desperate attempt to get stable collisions: Disable restitution and handle only one collision contact at a time. Collision still randomly explodes, even with differing results on the same file. This could indicate a threading issue, possibly also related to the dependency graph since multiple objects are involved in collisions. --- source/blender/blenkernel/intern/implicit.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/implicit.c b/source/blender/blenkernel/intern/implicit.c index f60a0ccac82..9ae53293397 100644 --- a/source/blender/blenkernel/intern/implicit.c +++ b/source/blender/blenkernel/intern/implicit.c @@ -2182,13 +2182,16 @@ static void setup_constraint_matrix(ClothModifierData *clmd, ColliderContacts *c zero_v3(z[v]); unit_m3(S[v].m); } + + verts[v].impulse_count = 0; } for (i = 0; i < totcolliders; ++i) { ColliderContacts *ct = &contacts[i]; for (j = 0; j < ct->totcollisions; ++j) { CollPair *collpair = &ct->collisions[j]; - float restitution = (1.0f - clmd->coll_parms->damping) * (1.0f - ct->ob->pd->pdef_sbdamp); +// float restitution = (1.0f - clmd->coll_parms->damping) * (1.0f - ct->ob->pd->pdef_sbdamp); + float restitution = 0.0f; int v = collpair->face1; float cnor[3], cmat[3][3]; float impulse[3]; @@ -2203,11 +2206,15 @@ static void setup_constraint_matrix(ClothModifierData *clmd, ColliderContacts *c vel_world_to_root(impulse, X[v], impulse, &roots[v]); add_v3_v3(z[v], impulse); + ++verts[v].impulse_count; + if (verts[v].impulse_count > 1) + continue; /* modify S to enforce velocity constraint in normal direction */ copy_v3_v3(cnor, collpair->normal); mul_transposed_m3_v3(roots[v].rot, cnor); mul_fvectorT_fvector(cmat, cnor, cnor); + sub_m3_m3m3(S[v].m, I, cmat); BKE_sim_debug_data_add_dot(clmd->debug_data, collpair->pa, 0, 1, 0, "collision", hash_collpair(936, collpair));