[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