[Bf-blender-cvs] [f47ace53f21] cloth-improvements: Fix mistake in collision indexing

Luca Rood noreply at git.blender.org
Wed Sep 19 15:57:39 CEST 2018


Commit: f47ace53f21102d631a8ac1511bd6c0783711216
Author: Luca Rood
Date:   Wed Sep 19 13:35:48 2018 +0200
Branches: cloth-improvements
https://developer.blender.org/rBf47ace53f21102d631a8ac1511bd6c0783711216

Fix mistake in collision indexing

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

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

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

diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c
index 867f9cfbcbb..3a4f9ec872c 100644
--- a/source/blender/blenkernel/intern/collision.c
+++ b/source/blender/blenkernel/intern/collision.c
@@ -72,7 +72,7 @@ typedef struct ColDetectData {
 	CollisionModifierData *collmd;
 	BVHTreeOverlap *overlap;
 	CollPair *collisions;
-	unsigned int *colind;
+	unsigned int *coll_count;
 	bool culling;
 	bool use_normal;
 } ColDetectData;
@@ -81,7 +81,7 @@ typedef struct SelfColDetectData {
 	ClothModifierData *clmd;
 	BVHTreeOverlap *overlap;
 	CollPair *collisions;
-	unsigned int *colind;
+	unsigned int *coll_count;
 } SelfColDetectData;
 
 /***********************************
@@ -662,7 +662,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,
-                                           int collision_end, ImpulseCluster **vert_imp_clusters, const float dt)
+                                           unsigned int collision_count, ImpulseCluster **vert_imp_clusters, const float dt)
 {
 	int result = 0;
 	Cloth *cloth1;
@@ -673,7 +673,7 @@ static int cloth_collision_response_static(ClothModifierData *clmd, CollisionMod
 
 	cloth1 = clmd->clothObject;
 
-	for (int i = 0; i <= collision_end; i++, collpair++) {
+	for (int i = 0; i < collision_count; i++, collpair++) {
 		float i1[3], i2[3], i3[3];
 
 		zero_v3(i1);
@@ -838,7 +838,7 @@ static int cloth_collision_response_static(ClothModifierData *clmd, CollisionMod
 	return result;
 }
 
-static int cloth_selfcollision_response_static(ClothModifierData *clmd, CollPair *collpair, int collision_end,
+static int cloth_selfcollision_response_static(ClothModifierData *clmd, CollPair *collpair, unsigned int collision_count,
                                                ImpulseCluster **vert_imp_clusters, const float dt)
 {
 	int result = 0;
@@ -849,7 +849,7 @@ static int cloth_selfcollision_response_static(ClothModifierData *clmd, CollPair
 
 	cloth1 = clmd->clothObject;
 
-	for (int i = 0; i <= collision_end; i++, collpair++) {
+	for (int i = 0; i < collision_count; i++, collpair++) {
 		float i1[3], i2[3], i3[3];
 
 		zero_v3(i1);
@@ -1030,7 +1030,7 @@ static void cloth_collision(
 	ClothModifierData *clmd = data->clmd;
 	CollisionModifierData *collmd = data->collmd;
 	CollPair *collpair = data->collisions;
-	unsigned int *colind = data->colind;
+	unsigned int *coll_count = data->coll_count;
 	const MVertTri *tri_a, *tri_b;
 	ClothVertex *verts1 = clmd->clothObject->verts;
 	float distance = 0.0f;
@@ -1049,7 +1049,7 @@ static void cloth_collision(
 	if ((distance <= (epsilon1 + epsilon2 + ALMOST_ZERO)) && (len_squared_v3(vect) > FLT_EPSILON)) {
 		int ind;
 
-		ind = atomic_add_and_fetch_u(colind, 1);
+		ind = atomic_add_and_fetch_u(coll_count, 1) - 1;
 
 		/* fill face_a */
 		collpair[ind].ap1 = tri_a->tri[0];
@@ -1081,7 +1081,7 @@ static void cloth_selfcollision(
 
 	ClothModifierData *clmd = data->clmd;
 	CollPair *collpair = data->collisions;
-	unsigned int *colind = data->colind;
+	unsigned int *coll_count = data->coll_count;
 	const MVertTri *tri_a, *tri_b;
 	ClothVertex *verts1 = clmd->clothObject->verts;
 	float distance = 0.0f;
@@ -1114,7 +1114,7 @@ static void cloth_selfcollision(
 	if ((distance <= (epsilon * 2.0f + ALMOST_ZERO)) && (len_squared_v3(vect) > FLT_EPSILON)) {
 		int ind;
 
-		ind = atomic_add_and_fetch_u(colind, 1);
+		ind = atomic_add_and_fetch_u(coll_count, 1) - 1;
 
 		/* fill face_a */
 		collpair[ind].ap1 = tri_a->tri[0];
@@ -1288,17 +1288,16 @@ void free_collider_cache(ListBase **colliders)
 }
 
 static void cloth_bvh_objcollisions_nearcheck(ClothModifierData * clmd, CollisionModifierData *collmd,
-                                              CollPair **collisions, unsigned int *colind, int numresult,
+                                              CollPair **collisions, unsigned int *coll_count, int numresult,
                                               BVHTreeOverlap *overlap, bool culling, bool use_normal)
 {
 	*collisions = (CollPair *)MEM_mallocN(sizeof(CollPair) * numresult, "collision array");
-	*colind = -1;
 
 	ColDetectData data = {.clmd = clmd,
 	                      .collmd = collmd,
 	                      .overlap = overlap,
 	                      .collisions = *collisions,
-	                      .colind = colind,
+	                      .coll_count = coll_count,
 	                      .culling = culling,
 	                      .use_normal = use_normal};
 
@@ -1308,15 +1307,13 @@ static void cloth_bvh_objcollisions_nearcheck(ClothModifierData * clmd, Collisio
 	BLI_task_parallel_range(0, numresult, &data, cloth_collision, &settings);
 }
 
-static void cloth_bvh_selfcollisions_nearcheck(ClothModifierData * clmd, CollPair *collisions, unsigned int *colind,
+static void cloth_bvh_selfcollisions_nearcheck(ClothModifierData * clmd, CollPair *collisions, unsigned int *coll_count,
                                                int numresult, BVHTreeOverlap *overlap)
 {
-	*colind = -1;
-
 	SelfColDetectData data = {.clmd = clmd,
 	                          .overlap = overlap,
 	                          .collisions = collisions,
-	                          .colind = colind};
+	                          .coll_count = coll_count};
 
 	ParallelRangeSettings settings;
 	BLI_parallel_range_settings_defaults(&settings);
@@ -1325,7 +1322,7 @@ static void cloth_bvh_selfcollisions_nearcheck(ClothModifierData * clmd, CollPai
 }
 
 static int cloth_bvh_objcollisions_resolve (ClothModifierData * clmd, Object **collobjs, CollPair **collisions,
-                                            unsigned int *collisions_index, const unsigned int numcollobj, const float dt)
+                                            unsigned int *collision_counts, const unsigned int numcollobj, const float dt)
 {
 	Cloth *cloth = clmd->clothObject;
 	int i = 0, j = 0, mvert_num = 0;
@@ -1351,7 +1348,7 @@ static int cloth_bvh_objcollisions_resolve (ClothModifierData * clmd, Object **c
 			CollisionModifierData *collmd = (CollisionModifierData *)modifiers_findByType(collob, eModifierType_Collision);
 
 			if ( collmd->bvhtree ) {
-				result += cloth_collision_response_static(clmd, collmd, collob, collisions[i], collisions_index[i], vert_imp_clusters, dt);
+				result += cloth_collision_response_static(clmd, collmd, collob, collisions[i], collision_counts[i], vert_imp_clusters, dt);
 			}
 		}
 
@@ -1383,7 +1380,7 @@ static int cloth_bvh_objcollisions_resolve (ClothModifierData * clmd, Object **c
 	return ret;
 }
 
-static int cloth_bvh_selfcollisions_resolve(ClothModifierData * clmd, CollPair *collisions, int collisions_index, const float dt)
+static int cloth_bvh_selfcollisions_resolve(ClothModifierData * clmd, CollPair *collisions, int collision_count, const float dt)
 {
 	Cloth *cloth = clmd->clothObject;
 	int i = 0, j = 0, mvert_num = 0;
@@ -1402,7 +1399,7 @@ static int cloth_bvh_selfcollisions_resolve(ClothModifierData * clmd, CollPair *
 	for (j = 0; j < iter; j++) { /* 5 is just a value that ensures convergence */
 		result = 0;
 
-		result += cloth_selfcollision_response_static (clmd, collisions, collisions_index, vert_imp_clusters, dt);
+		result += cloth_selfcollision_response_static (clmd, collisions, collision_count, vert_imp_clusters, dt);
 
 		// apply impulses in parallel
 		if (result) {
@@ -1485,10 +1482,10 @@ int cloth_bvh_objcollision(Object *ob, ClothModifierData *clmd, float step, floa
 
 		if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED) {
 			CollPair **collisions;
-			unsigned int *collisions_index;
+			unsigned int *collision_counts;
 
 			collisions = MEM_callocN(sizeof(CollPair *) *numcollobj, "CollPair");
-			collisions_index = MEM_callocN(sizeof(*collisions_index) *numcollobj, "CollPair");
+			collision_counts = MEM_callocN(sizeof(*collision_counts) *numcollobj, "CollPair");
 
 			// check all collision objects
 			for (i = 0; i < numcollobj; i++) {
@@ -1506,17 +1503,14 @@ int cloth_bvh_objcollision(Object *ob, ClothModifierData *clmd, float step, floa
 				// go to next object if no overlap is there
 				if (result && overlap) {
 					/* check if collisions really happen (costly near check) */
-					cloth_bvh_objcollisions_nearcheck(clmd, collmd, &collisions[i], &collisions_index[i], result, overlap,
+					cloth_bvh_objcollisions_nearcheck(clmd, collmd, &collisions[i], &collision_counts[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, collision_counts, numcollobj, dt);
 			ret2 += ret;
 
 			for (i = 0; i < numcollobj; i++) {
@@ -1524,7 +1518,7 @@ int cloth_bvh_objcollision(Object *ob, ClothModifierData *clmd, float step, floa
 			}
 
 			MEM_freeN(collisions);
-			MEM_freeN(collisions_index);
+			MEM_freeN(collision_counts);
 		}
 
 		////////////////////////////////////////////////////////////
@@ -1534,7 +1528,7 @@ int cloth_bvh_objcollision(Object *ob, ClothModifierData *clmd, float step, floa
 			BVHTreeOverlap *overlap = NULL;
 			unsigned int result = 0;
 			CollPair *collisions = NULL;
-			unsigned int collisions_index;
+			unsigned int collision_count = 0;
 
 			// collisions = 1;
 			verts = cloth->verts; // needed for openMP
@@ -1551,9 +1545,9 @@ int cloth_bvh_objcollision(Object *ob, ClothModifierData *clmd, float step, floa
 				if (result && overlap) {
 					collisions = (CollPair *)MEM_mallocN(sizeof(CollPair) * result, "collision array");
 
-					cloth_bvh_selfcollisions_nearcheck(clmd, collisions, &collisions_index, result, overlap);
+					cloth_bvh_selfcollisions_nearcheck(clmd, collisions, &collision_count, result, overlap);
 
-					ret += cloth_bvh_selfcollisions_resolve(clmd, collisions,  collisions_index, dt);
+					ret += cloth_bvh_selfcollisions_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list