[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