diff options
author | Lukas Tönne <lukas.toenne@gmail.com> | 2014-09-03 17:44:03 +0400 |
---|---|---|
committer | Lukas Tönne <lukas.toenne@gmail.com> | 2015-01-20 11:29:57 +0300 |
commit | fc083b4e5b5052e57c6217967f455f620f0f5ae1 (patch) | |
tree | 3764b0f2b8622d0e296bb3aff388d9c6848daf5e /source/blender/blenkernel/intern/implicit.c | |
parent | 0f45f4a3e25437b1353982f081acc6a833e2fd01 (diff) |
Preparation for collision code fixing.
Instead of handling contact tests and collision response in the same
function in collision.c, first generate contact points and return them
as a list, then free at the end of the stepping function. This way the
contact response can be integrated into the conjugate gradient method
properly instead of using the hackish and unstable double evaluation
that is currently used.
Diffstat (limited to 'source/blender/blenkernel/intern/implicit.c')
-rw-r--r-- | source/blender/blenkernel/intern/implicit.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/implicit.c b/source/blender/blenkernel/intern/implicit.c index c0058d361ae..2a50cde9e66 100644 --- a/source/blender/blenkernel/intern/implicit.c +++ b/source/blender/blenkernel/intern/implicit.c @@ -1968,6 +1968,8 @@ int implicit_solver(Object *ob, float frame, ClothModifierData *clmd, ListBase * float spf = (float)clmd->sim_parms->stepsPerFrame / clmd->sim_parms->timescale; /*float (*initial_cos)[3] = MEM_callocN(sizeof(float)*3*cloth->numverts, "initial_cos implicit.c");*/ /* UNUSED */ Implicit_Data *id = cloth->implicit; + ColliderContacts *contacts = NULL; + int totcolliders = 0; BKE_sim_debug_data_clear_category(clmd->debug_data, "collision"); @@ -1991,6 +1993,13 @@ int implicit_solver(Object *ob, float frame, ClothModifierData *clmd, ListBase * } } + /* determine contact points */ + if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED) { + if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_POINTS) { + cloth_find_point_contacts(ob, clmd, 0.0f, tf, &contacts, &totcolliders); + } + } + while (step < tf) { // damping velocity for artistic reasons mul_lfvectorS(id->V, id->V, clmd->sim_parms->vel_damping, numverts); @@ -2019,6 +2028,7 @@ int implicit_solver(Object *ob, float frame, ClothModifierData *clmd, ListBase * copy_v3_v3(verts[i].txold, id->X[i]); } +#if 0 if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED) { bool do_extra_solve = false; @@ -2090,13 +2100,17 @@ int implicit_solver(Object *ob, float frame, ClothModifierData *clmd, ListBase * // itend(); // printf("collision time: %f\n", (float)itval()); +#else + // X = Xnew; + cp_lfvector(id->X, id->Xnew, numverts); +#endif // V = Vnew; cp_lfvector(id->V, id->Vnew, numverts); step += dt; } - + for (i = 0; i < numverts; i++) { if ((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL) && (verts [i].flags & CLOTH_VERT_FLAG_PINNED)) { copy_v3_v3(verts[i].txold, verts[i].xconst); // TODO: test --> should be .x @@ -2110,6 +2124,11 @@ int implicit_solver(Object *ob, float frame, ClothModifierData *clmd, ListBase * } } + /* free contact points */ + if (contacts) { + cloth_free_contacts(contacts, totcolliders); + } + /* unused */ /*MEM_freeN(initial_cos);*/ |