[Bf-blender-cvs] [bc738592df8] cloth-improvements: Multithread self collision detection

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


Commit: bc738592df8726454e67a08a9837744ff7ccf78f
Author: Luca Rood
Date:   Mon Apr 3 16:02:56 2017 +0200
Branches: cloth-improvements
https://developer.blender.org/rBbc738592df8726454e67a08a9837744ff7ccf78f

Multithread self collision detection

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

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

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

diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c
index cae485ad65c..0e7d5bb3f17 100644
--- a/source/blender/blenkernel/intern/collision.c
+++ b/source/blender/blenkernel/intern/collision.c
@@ -76,6 +76,14 @@ typedef struct ColDetectData {
 	SpinLock *lock;
 } ColDetectData;
 
+typedef struct SelfColDetectData {
+	ClothModifierData *clmd;
+	BVHTreeOverlap *overlap;
+	CollPair *collisions;
+	int *colind;
+	SpinLock *lock;
+} SelfColDetectData;
+
 /***********************************
 Collision modifier code start
 ***********************************/
@@ -1063,17 +1071,21 @@ static void cloth_collision(void *userdata, void *UNUSED(userdata_chunk), const
 	}
 }
 
-static void cloth_selfcollision(ModifierData *md1, BVHTreeOverlap *overlap, CollPair *collpair, int *colind)
+static void cloth_selfcollision(void *userdata, void *UNUSED(userdata_chunk), const int index, const int UNUSED(threadid))
 {
-	ClothModifierData *clmd = (ClothModifierData *)md1;
+	SelfColDetectData *data = (SelfColDetectData *)userdata;
+
+	ClothModifierData *clmd = data->clmd;
+	CollPair *collpair = data->collisions;
+	int *colind = data->colind;
 	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];
+	tri_a = &clmd->clothObject->tri[data->overlap[index].indexA];
+	tri_b = &clmd->clothObject->tri[data->overlap[index].indexB];
 
 	for (unsigned int i = 0; i < 3; i++) {
 		for (unsigned int j = 0; j < 3; j++) {
@@ -1098,7 +1110,9 @@ static void cloth_selfcollision(ModifierData *md1, BVHTreeOverlap *overlap, Coll
 	if ((distance <= (epsilon * 2.0f + ALMOST_ZERO)) && (len_squared_v3(vect) > FLT_EPSILON)) {
 		int ind;
 
+		BLI_spin_lock(data->lock);
 		ind = ++(*colind);
+		BLI_spin_unlock(data->lock);
 
 		/* fill face_a */
 		collpair[ind].ap1 = tri_a->tri[0];
@@ -1295,16 +1309,23 @@ static void cloth_bvh_objcollisions_nearcheck(ClothModifierData * clmd, Collisio
 	BLI_spin_end(&lock);
 }
 
-static void cloth_bvh_selfcollisions_nearcheck(ClothModifierData * clmd, CollPair *collisions, int *collisions_index,
+static void cloth_bvh_selfcollisions_nearcheck(ClothModifierData * clmd, CollPair *collisions, int *colind,
                                                int numresult, BVHTreeOverlap *overlap)
 {
-	int i;
+	SpinLock lock;
+	BLI_spin_init(&lock);
 
-	*collisions_index = -1;
+	*colind = -1;
 
-	for (i = 0; i < numresult; i++) {
-		cloth_selfcollision((ModifierData *)clmd, overlap+i, collisions, collisions_index);
-	}
+	SelfColDetectData data = {.clmd = clmd,
+	                          .overlap = overlap,
+	                          .collisions = collisions,
+	                          .colind = colind,
+	                          .lock = &lock};
+
+	BLI_task_parallel_range_ex(0, numresult, &data, NULL, 0, cloth_selfcollision, true, false);
+
+	BLI_spin_end(&lock);
 }
 
 static int cloth_bvh_objcollisions_resolve (ClothModifierData * clmd, Object **collobjs, CollPair **collisions,




More information about the Bf-blender-cvs mailing list