[Bf-blender-cvs] [5d07a070cb8] cloth-improvements: Collision refactor (prep for threading)

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


Commit: 5d07a070cb83728a8f6b095fc0b2e2abf807e7bb
Author: Luca Rood
Date:   Mon Apr 3 12:00:23 2017 +0200
Branches: cloth-improvements
https://developer.blender.org/rB5d07a070cb83728a8f6b095fc0b2e2abf807e7bb

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 5e2047dbfa2..aa6969070eb 100644
--- a/source/blender/blenkernel/intern/collision.c
+++ b/source/blender/blenkernel/intern/collision.c
@@ -641,7 +641,7 @@ DO_INLINE void collision_interpolateOnTriangle (float to[3], float v1[3], float
 }
 
 static int cloth_collision_response_static(ClothModifierData *clmd, CollisionModifierData *collmd, Object *collob, CollPair *collpair,
-                                           CollPair *collision_end, ImpulseCluster **vert_imp_clusters, const float dt)
+                                           int collision_end, ImpulseCluster **vert_imp_clusters, const float dt)
 {
 	int result = 0;
 	Cloth *cloth1;
@@ -652,7 +652,7 @@ static int cloth_collision_response_static(ClothModifierData *clmd, CollisionMod
 
 	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);
@@ -999,7 +999,7 @@ static int cloth_selfcollision_response_static(ClothModifierData *clmd, CollPair
 #endif
 
 //Determines collisions on overlap, collisions are written to collpair[i] and collision+number_collision_found is returned
-static CollPair* cloth_collision(ModifierData *md1, ModifierData *md2, BVHTreeOverlap *overlap, CollPair *collpair, bool culling, bool use_normal)
+static void cloth_collision(ModifierData *md1, ModifierData *md2, BVHTreeOverlap *overlap, CollPair *collpair, int *colind, bool culling, bool use_normal)
 {
 	ClothModifierData *clmd = (ClothModifierData *)md1;
 	CollisionModifierData *collmd = (CollisionModifierData *)md2;
@@ -1008,34 +1008,38 @@ static CollPair* cloth_collision(ModifierData *md1, ModifierData *md2, BVHTreeOv
 	float distance = 0.0f;
 	float epsilon1 = clmd->coll_parms->epsilon;
 	float epsilon2 = BLI_bvhtree_get_epsilon ( collmd->bvhtree );
+	float pa[3], pb[3], vect[3];
 
 	tri_a = &clmd->clothObject->tri[overlap->indexA];
 	tri_b = &collmd->tri[overlap->indexB];
 
-	/* fill face_a */
-	collpair->ap1 = tri_a->tri[0];
-	collpair->ap2 = tri_a->tri[1];
-	collpair->ap3 = tri_a->tri[2];
+	// calc distance + normal
+	distance = compute_collision_point(verts1[tri_a->tri[0]].tx, verts1[tri_a->tri[1]].tx, verts1[tri_a->tri[2]].tx,
+									   collmd->current_x[tri_b->tri[0]].co, collmd->current_x[tri_b->tri[1]].co, collmd->current_x[tri_b->tri[2]].co,
+									   culling, use_normal, pa, pb, vect);
 
-	/* fill face_b */
-	collpair->bp1 = tri_b->tri[0];
-	collpair->bp2 = tri_b->tri[1];
-	collpair->bp3 = tri_b->tri[2];
+	if ((distance <= (epsilon1 + epsilon2 + ALMOST_ZERO)) && (len_squared_v3(vect) > FLT_EPSILON)) {
+		(*colind)++;
 
-	// calc distance + normal
-	distance = compute_collision_point(verts1[collpair->ap1].tx, verts1[collpair->ap2].tx, verts1[collpair->ap3].tx,
-									   collmd->current_x[collpair->bp1].co, collmd->current_x[collpair->bp2].co, collmd->current_x[collpair->bp3].co,
-									   culling, use_normal, collpair->pa, collpair->pb, collpair->vector);
+		/* fill face_a */
+		collpair[*colind].ap1 = tri_a->tri[0];
+		collpair[*colind].ap2 = tri_a->tri[1];
+		collpair[*colind].ap3 = tri_a->tri[2];
 
-	if ((distance <= (epsilon1 + epsilon2 + ALMOST_ZERO)) && (len_squared_v3(collpair->vector) > FLT_EPSILON)) {
-		normalize_v3_v3(collpair->normal, collpair->vector);
+		/* fill face_b */
+		collpair[*colind].bp1 = tri_b->tri[0];
+		collpair[*colind].bp2 = tri_b->tri[1];
+		collpair[*colind].bp3 = tri_b->tri[2];
 
-		collpair->distance = distance;
-		collpair->flag = 0;
-		collpair++;
-	}
+		copy_v3_v3(collpair[*colind].pa, pa);
+		copy_v3_v3(collpair[*colind].pb, pb);
+		copy_v3_v3(collpair[*colind].vector, vect);
 
-	return collpair;
+		normalize_v3_v3(collpair[*colind].normal, collpair[*colind].vector);
+
+		collpair[*colind].distance = distance;
+		collpair[*colind].flag = 0;
+	}
 }
 
 static CollPair* cloth_selfcollision(ModifierData *md1, BVHTreeOverlap *overlap, CollPair *collpair)
@@ -1242,17 +1246,17 @@ void free_collider_cache(ListBase **colliders)
 
 
 static void cloth_bvh_objcollisions_nearcheck(ClothModifierData * clmd, CollisionModifierData *collmd,
-                                              CollPair **collisions, CollPair **collisions_index, int numresult,
+                                              CollPair **collisions, int *colind, int numresult,
                                               BVHTreeOverlap *overlap, bool culling, bool use_normal)
 {
 	int i;
 	
 	*collisions = (CollPair *)MEM_mallocN(sizeof(CollPair) * numresult, "collision array");
-	*collisions_index = *collisions;
+	*colind = -1;
 
 	for (i = 0; i < numresult; i++) {
-		*collisions_index = cloth_collision((ModifierData *)clmd, (ModifierData *)collmd,
-		                                    overlap+i, *collisions_index, culling, use_normal);
+		cloth_collision((ModifierData *)clmd, (ModifierData *)collmd,
+		                overlap+i, *collisions, colind, culling, use_normal);
 	}
 }
 
@@ -1270,7 +1274,7 @@ static void cloth_bvh_selfcollisions_nearcheck(ClothModifierData * clmd, CollPai
 }
 
 static int cloth_bvh_objcollisions_resolve (ClothModifierData * clmd, Object **collobjs, CollPair **collisions,
-                                            CollPair **collisions_index, const unsigned int numcollobj, const float dt)
+                                            int *collisions_index, const unsigned int numcollobj, const float dt)
 {
 	Cloth *cloth = clmd->clothObject;
 	int i = 0, j = 0, mvert_num = 0;
@@ -1429,10 +1433,11 @@ int cloth_bvh_objcollision(Object *ob, ClothModifierData *clmd, float step, floa
 		ret2 = 0;
 
 		if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED) {
-			CollPair **collisions, **collisions_index;
+			CollPair **collisions;
+			int *collisions_index;
 
 			collisions = MEM_callocN(sizeof(CollPair *) *numcollobj, "CollPair");
-			collisions_index = MEM_callocN(sizeof(CollPair *) *numcollobj, "CollPair");
+			collisions_index = MEM_callocN(sizeof(*collisions_index) *numcollobj, "CollPair");
 
 			// check all collision objects
 			for (i = 0; i < numcollobj; i++) {
@@ -1453,11 +1458,14 @@ int cloth_bvh_objcollision(Object *ob, ClothModifierData *clmd, float step, floa
 					cloth_bvh_objcollisions_nearcheck(clmd, collmd, &collisions[i], &collisions_index[i], result, overlap,
 					                                  (collob->pd->flag & PFIELD_CLOTH_USE_CULLING), (collob->pd->flag & PFIELD_CLOTH_USE_NORMAL));
 				}
+				else {
+					collisions_index[i] = -1;
+				}
 
 				MEM_SAFE_FREE(overlap);
 			}
 
-			ret += cloth_bvh_objcollisions_resolve(clmd, collobjs, collisions,  collisions_index, numcollobj, dt);
+			ret += cloth_bvh_objcollisions_resolve(clmd, collobjs, collisions, collisions_index, numcollobj, dt);
 			ret2 += ret;
 
 			for (i = 0; i < numcollobj; i++) {




More information about the Bf-blender-cvs mailing list