[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