[Bf-blender-cvs] [1cc8f2d79b] cloth-improvements: Apply all object collisions simultaneously
Luca Rood
noreply at git.blender.org
Wed Feb 1 07:11:56 CET 2017
Commit: 1cc8f2d79bbde2645a36fdeee105b8d6175cd359
Author: Luca Rood
Date: Wed Feb 1 01:17:00 2017 -0200
Branches: cloth-improvements
https://developer.blender.org/rB1cc8f2d79bbde2645a36fdeee105b8d6175cd359
Apply all object collisions simultaneously
This makes all multi-object collisions be solved simultaneously, as not
to give any of them priority over the others (as in the sequential
collision solve that was implemented)
Note that self collisions have not been integrated, and are instead
solved independently after the object collisions. This is so that they
don't have to fight against the object collisions, as those are
generally more robust, and might cause issues with the self collisions.
===================================================================
M source/blender/blenkernel/intern/collision.c
===================================================================
diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c
index 0e0bd6a3a3..71dee85d9c 100644
--- a/source/blender/blenkernel/intern/collision.c
+++ b/source/blender/blenkernel/intern/collision.c
@@ -1113,8 +1113,8 @@ static void cloth_bvh_selfcollisions_nearcheck (ClothModifierData * clmd, CollPa
}
}
-static int cloth_bvh_objcollisions_resolve (ClothModifierData * clmd, CollisionModifierData *collmd, Object *collob,
- CollPair *collisions, CollPair *collisions_index)
+static int cloth_bvh_objcollisions_resolve (ClothModifierData * clmd, Object **collobjs, CollPair **collisions,
+ CollPair **collisions_index, const unsigned int numcollobj)
{
Cloth *cloth = clmd->clothObject;
int i=0, j = 0, /*numfaces = 0, */ mvert_num = 0;
@@ -1133,30 +1133,34 @@ static int cloth_bvh_objcollisions_resolve (ClothModifierData * clmd, CollisionM
for ( j = 0; j < 2; j++ ) { /* 5 is just a value that ensures convergence */
result = 0;
- if ( collmd->bvhtree ) {
- result += cloth_collision_response_static(clmd, collmd, collob, collisions, collisions_index, vert_imp_clusters);
+ for (i = 0; i < numcollobj; i++) {
+ Object *collob= collobjs[i];
+ CollisionModifierData *collmd = (CollisionModifierData *)modifiers_findByType(collob, eModifierType_Collision);
- // apply impulses in parallel
- if (result) {
- for (i = 0; i < mvert_num; i++) {
- // calculate "velocities" (just xnew = xold + v; no dt in v)
- if (verts[i].impulse_count) {
- compute_dominant_impulses(&vert_imp_clusters[i], verts[i].impulse);
- free_impulse_clusters(vert_imp_clusters[i]);
- vert_imp_clusters[i] = NULL;
+ if ( collmd->bvhtree ) {
+ result += cloth_collision_response_static(clmd, collmd, collob, collisions[i], collisions_index[i], vert_imp_clusters);
+ }
+ }
+
+ // apply impulses in parallel
+ if (result) {
+ for (i = 0; i < mvert_num; i++) {
+ // calculate "velocities" (just xnew = xold + v; no dt in v)
+ if (verts[i].impulse_count) {
+ compute_dominant_impulses(&vert_imp_clusters[i], verts[i].impulse);
+ free_impulse_clusters(vert_imp_clusters[i]);
+ vert_imp_clusters[i] = NULL;
- madd_v3_v3v3fl(verts[i].tv, verts[i].tv, verts[i].impulse, 0.5f);
- madd_v3_v3v3fl(verts[i].dcvel, verts[i].dcvel, verts[i].impulse, 0.5f);
- zero_v3(verts[i].impulse);
- verts[i].impulse_count = 0;
+ madd_v3_v3v3fl(verts[i].tv, verts[i].tv, verts[i].impulse, 0.5f);
+ madd_v3_v3v3fl(verts[i].dcvel, verts[i].dcvel, verts[i].impulse, 0.5f);
+ zero_v3(verts[i].impulse);
+ verts[i].impulse_count = 0;
- ret++;
- }
+ ret++;
}
}
}
-
- if (!result) {
+ else {
break;
}
}
@@ -1288,16 +1292,15 @@ int cloth_bvh_objcollision(Object *ob, ClothModifierData *clmd, float step, floa
/* check if collisions really happen (costly near check) */
cloth_bvh_objcollisions_nearcheck ( clmd, collmd, &collisions[i],
&collisions_index[i], result, overlap, dt/(float)clmd->coll_parms->loop_count);
-
- // resolve nearby collisions
- ret += cloth_bvh_objcollisions_resolve(clmd, collmd, collob, collisions[i], collisions_index[i]);
- ret2 += ret;
}
if ( overlap )
MEM_freeN ( overlap );
}
+ ret += cloth_bvh_objcollisions_resolve(clmd, collobjs, collisions, collisions_index, numcollobj);
+ ret2 += ret;
+
for (i = 0; i < numcollobj; i++) {
if ( collisions[i] ) MEM_freeN ( collisions[i] );
}
More information about the Bf-blender-cvs
mailing list