[Bf-blender-cvs] [6b818dcf793] cloth-improvements: Self collision refactor (prep for threading)

Luca Rood noreply at git.blender.org
Mon Apr 3 16:05:20 CEST 2017


Commit: 6b818dcf7932495ceb847c4f88d79830cc83af8f
Author: Luca Rood
Date:   Mon Apr 3 15:44:24 2017 +0200
Branches: cloth-improvements
https://developer.blender.org/rB6b818dcf7932495ceb847c4f88d79830cc83af8f

Self collision refactor (prep for threading)

===================================================================

M	source/blender/blenkernel/intern/collision.c

===================================================================

diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c
index 963dcdb0e57..cae485ad65c 100644
--- a/source/blender/blenkernel/intern/collision.c
+++ b/source/blender/blenkernel/intern/collision.c
@@ -830,7 +830,7 @@ static int cloth_collision_response_static(ClothModifierData *clmd, CollisionMod
 	return result;
 }
 
-static int cloth_selfcollision_response_static(ClothModifierData *clmd, CollPair *collpair, CollPair *collision_end,
+static int cloth_selfcollision_response_static(ClothModifierData *clmd, CollPair *collpair, int collision_end,
                                                ImpulseCluster **vert_imp_clusters, const float dt)
 {
 	int result = 0;
@@ -841,7 +841,7 @@ static int cloth_selfcollision_response_static(ClothModifierData *clmd, CollPair
 
 	cloth1 = clmd->clothObject;
 
-	for (; collpair != collision_end; collpair++) {
+	for (int i = 0; i <= collision_end; i++, collpair++) {
 		float i1[3], i2[3], i3[3];
 
 		zero_v3(i1);
@@ -1063,13 +1063,14 @@ static void cloth_collision(void *userdata, void *UNUSED(userdata_chunk), const
 	}
 }
 
-static CollPair* cloth_selfcollision(ModifierData *md1, BVHTreeOverlap *overlap, CollPair *collpair)
+static void cloth_selfcollision(ModifierData *md1, BVHTreeOverlap *overlap, CollPair *collpair, int *colind)
 {
 	ClothModifierData *clmd = (ClothModifierData *)md1;
 	const MVertTri *tri_a, *tri_b;
 	ClothVertex *verts1 = clmd->clothObject->verts;
 	float distance = 0.0f;
 	float epsilon = clmd->coll_parms->selfepsilon;
+	float pa[3], pb[3], vect[3];
 
 	tri_a = &clmd->clothObject->tri[overlap->indexA];
 	tri_b = &clmd->clothObject->tri[overlap->indexB];
@@ -1077,7 +1078,7 @@ static CollPair* cloth_selfcollision(ModifierData *md1, BVHTreeOverlap *overlap,
 	for (unsigned int i = 0; i < 3; i++) {
 		for (unsigned int j = 0; j < 3; j++) {
 			if (tri_a->tri[i] == tri_b->tri[j]) {
-				return collpair;
+				return;
 			}
 		}
 	}
@@ -1085,34 +1086,39 @@ static CollPair* cloth_selfcollision(ModifierData *md1, BVHTreeOverlap *overlap,
 	if (((verts1[tri_a->tri[0]].flags & verts1[tri_a->tri[1]].flags & verts1[tri_a->tri[2]].flags) |
 	     (verts1[tri_b->tri[0]].flags & verts1[tri_b->tri[1]].flags & verts1[tri_b->tri[2]].flags)) & CLOTH_VERT_FLAG_NOSELFCOLL)
 	{
-		return collpair;
+		return;
 	}
 
-	/* fill face_a */
-	collpair->ap1 = tri_a->tri[0];
-	collpair->ap2 = tri_a->tri[1];
-	collpair->ap3 = tri_a->tri[2];
-
-	/* fill face_b */
-	collpair->bp1 = tri_b->tri[0];
-	collpair->bp2 = tri_b->tri[1];
-	collpair->bp3 = tri_b->tri[2];
-
 	// calc distance + normal
-	distance = compute_collision_point(verts1[collpair->ap1].tx, verts1[collpair->ap2].tx, verts1[collpair->ap3].tx,
-									   verts1[collpair->bp1].tx, verts1[collpair->bp2].tx, verts1[collpair->bp3].tx,
-									   false, false, collpair->pa, collpair->pb, collpair->vector);
+	distance = compute_collision_point(verts1[tri_a->tri[0]].tx, verts1[tri_a->tri[1]].tx, verts1[tri_a->tri[2]].tx,
+									   verts1[tri_b->tri[0]].tx, verts1[tri_b->tri[1]].tx, verts1[tri_b->tri[2]].tx,
+									   false, false, pa, pb, vect);
 
 	// distance -1 means no collision result
-	if ((distance <= (epsilon * 2.0f + ALMOST_ZERO)) && (len_squared_v3(collpair->vector) > FLT_EPSILON)) {
-		normalize_v3_v3(collpair->normal, collpair->vector);
+	if ((distance <= (epsilon * 2.0f + ALMOST_ZERO)) && (len_squared_v3(vect) > FLT_EPSILON)) {
+		int ind;
 
-		collpair->distance = distance;
-		collpair->flag = 0;
-		collpair++;
-	}
+		ind = ++(*colind);
 
-	return collpair;
+		/* fill face_a */
+		collpair[ind].ap1 = tri_a->tri[0];
+		collpair[ind].ap2 = tri_a->tri[1];
+		collpair[ind].ap3 = tri_a->tri[2];
+
+		/* fill face_b */
+		collpair[ind].bp1 = tri_b->tri[0];
+		collpair[ind].bp2 = tri_b->tri[1];
+		collpair[ind].bp3 = tri_b->tri[2];
+
+		copy_v3_v3(collpair[ind].pa, pa);
+		copy_v3_v3(collpair[ind].pb, pb);
+		copy_v3_v3(collpair[ind].vector, vect);
+
+		normalize_v3_v3(collpair[ind].normal, collpair[ind].vector);
+
+		collpair[ind].distance = distance;
+		collpair[ind].flag = 0;
+	}
 }
 
 static void add_collision_object(Object ***objs, unsigned int *numobj, unsigned int *maxobj, Object *ob, Object *self, int level, unsigned int modifier_type)
@@ -1289,16 +1295,15 @@ static void cloth_bvh_objcollisions_nearcheck(ClothModifierData * clmd, Collisio
 	BLI_spin_end(&lock);
 }
 
-static void cloth_bvh_selfcollisions_nearcheck(ClothModifierData * clmd, CollPair **collisions, CollPair **collisions_index,
+static void cloth_bvh_selfcollisions_nearcheck(ClothModifierData * clmd, CollPair *collisions, int *collisions_index,
                                                int numresult, BVHTreeOverlap *overlap)
 {
 	int i;
 
-	*collisions = (CollPair *)MEM_mallocN(sizeof(CollPair) * numresult, "collision array");
-	*collisions_index = *collisions;
+	*collisions_index = -1;
 
 	for (i = 0; i < numresult; i++) {
-		*collisions_index = cloth_selfcollision((ModifierData *)clmd, overlap+i, *collisions_index);
+		cloth_selfcollision((ModifierData *)clmd, overlap+i, collisions, collisions_index);
 	}
 }
 
@@ -1361,7 +1366,7 @@ static int cloth_bvh_objcollisions_resolve (ClothModifierData * clmd, Object **c
 	return ret;
 }
 
-static int cloth_bvh_selfcollisions_resolve(ClothModifierData * clmd, CollPair *collisions, CollPair *collisions_index, const float dt)
+static int cloth_bvh_selfcollisions_resolve(ClothModifierData * clmd, CollPair *collisions, int collisions_index, const float dt)
 {
 	Cloth *cloth = clmd->clothObject;
 	int i = 0, j = 0, mvert_num = 0;
@@ -1512,7 +1517,7 @@ int cloth_bvh_objcollision(Object *ob, ClothModifierData *clmd, float step, floa
 			BVHTreeOverlap *overlap = NULL;
 			unsigned int result = 0;
 			CollPair *collisions = NULL;
-			CollPair *collisions_index;
+			int collisions_index;
 
 			// collisions = 1;
 			verts = cloth->verts; // needed for openMP
@@ -1527,9 +1532,11 @@ int cloth_bvh_objcollision(Object *ob, ClothModifierData *clmd, float step, floa
 				overlap = BLI_bvhtree_overlap(cloth->bvhselftree, cloth->bvhselftree, &result, NULL, NULL);
 
 				if (result && overlap) {
-					cloth_bvh_selfcollisions_nearcheck (clmd, &collisions, &collisions_index, result, overlap);
+					collisions = (CollPair *)MEM_mallocN(sizeof(CollPair) * result, "collision array");
+
+					cloth_bvh_selfcollisions_nearcheck(clmd, collisions, &collisions_index, result, overlap);
 
-					ret += cloth_bvh_selfcollisions_resolve ( clmd, collisions,  collisions_index, dt);
+					ret += cloth_bvh_selfcollisions_resolve(clmd, collisions,  collisions_index, dt);
 					ret2 += ret;
 				}




More information about the Bf-blender-cvs mailing list