[Bf-blender-cvs] [fe9debc47b] cloth-improvements: Fix critical collision bug

Luca Rood noreply at git.blender.org
Fri Mar 17 04:51:16 CET 2017


Commit: fe9debc47bf573e0d0f4c2c6233f84827750bfe2
Author: Luca Rood
Date:   Fri Mar 17 00:46:33 2017 -0300
Branches: cloth-improvements
https://developer.blender.org/rBfe9debc47bf573e0d0f4c2c6233f84827750bfe2

Fix critical collision bug

Collision object coordinates were not being updated when moving back in
time, causing simulation recalculations to somethimes have the collision
object only at the final position on the first simulated frame.

This also changes collision objects to use static bvh (like the cloth
bvh), which should cause a slight performance improvement.

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

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

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

diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c
index 95a384e94c..d7fad86355 100644
--- a/source/blender/blenkernel/intern/collision.c
+++ b/source/blender/blenkernel/intern/collision.c
@@ -70,7 +70,7 @@ Collision modifier code start
 /* step is limited from 0 (frame start position) to 1 (frame end position) */
 void collision_move_object(CollisionModifierData *collmd, float step, float prevstep)
 {
-	float tv[3] = {0, 0, 0};
+	float oldx[3];
 	unsigned int i = 0;
 
 	/* the collider doesn't move this frame */
@@ -83,15 +83,14 @@ void collision_move_object(CollisionModifierData *collmd, float step, float prev
 	}
 
 	for (i = 0; i < collmd->mvert_num; i++) {
-		sub_v3_v3v3(tv, collmd->xnew[i].co, collmd->x[i].co);
-		VECADDS(collmd->current_x[i].co, collmd->x[i].co, tv, prevstep);
-		VECADDS(collmd->current_xnew[i].co, collmd->x[i].co, tv, step);
-		sub_v3_v3v3(collmd->current_v[i].co, collmd->current_xnew[i].co, collmd->current_x[i].co);
+		interp_v3_v3v3(oldx, collmd->x[i].co, collmd->xnew[i].co, prevstep);
+		interp_v3_v3v3(collmd->current_x[i].co, collmd->x[i].co, collmd->xnew[i].co, step);
+		sub_v3_v3v3(collmd->current_v[i].co, collmd->current_x[i].co, oldx);
 	}
 
 	bvhtree_update_from_mvert(
-	        collmd->bvhtree, collmd->current_x, collmd->current_xnew,
-	        collmd->tri, collmd->tri_num, true);
+	        collmd->bvhtree, collmd->current_x, NULL,
+	        collmd->tri, collmd->tri_num, false);
 }
 
 BVHTree *bvhtree_build_from_mvert(
diff --git a/source/blender/modifiers/intern/MOD_collision.c b/source/blender/modifiers/intern/MOD_collision.c
index e7ff0a90fb..c6e7d1b6c0 100644
--- a/source/blender/modifiers/intern/MOD_collision.c
+++ b/source/blender/modifiers/intern/MOD_collision.c
@@ -119,6 +119,7 @@ static void deformVerts(ModifierData *md, Object *ob,
 	if (dm) {
 		float current_time = 0;
 		unsigned int mvert_num = 0;
+		unsigned int i;
 
 		CDDM_apply_vert_coords(dm, vertexCos);
 		CDDM_calc_normals(dm);
@@ -129,116 +130,111 @@ static void deformVerts(ModifierData *md, Object *ob,
 			printf("current_time %f, collmd->time_xnew %f\n", current_time, collmd->time_xnew);
 		
 		mvert_num = dm->getNumVerts(dm);
-		
-		if (current_time > collmd->time_xnew) {
-			unsigned int i;
 
-			/* check if mesh has changed */
-			if (collmd->x && (mvert_num != collmd->mvert_num))
+		if (current_time < collmd->time_xnew) {
+			freeData((ModifierData *)collmd);
+		}
+		else if (current_time == collmd->time_xnew) {
+			if (mvert_num != collmd->mvert_num) {
 				freeData((ModifierData *)collmd);
+			}
+		}
 
-			if (collmd->time_xnew == -1000) { /* first time */
+		/* check if mesh has changed */
+		if (collmd->x && (mvert_num != collmd->mvert_num))
+			freeData((ModifierData *)collmd);
 
-				collmd->x = dm->dupVertArray(dm); /* frame start position */
+		if (collmd->time_xnew == -1000) { /* first time */
 
-				for (i = 0; i < mvert_num; i++) {
-					/* we save global positions */
-					mul_m4_v3(ob->obmat, collmd->x[i].co);
-				}
-				
-				collmd->xnew = MEM_dupallocN(collmd->x); // frame end position
-				collmd->current_x = MEM_dupallocN(collmd->x); // inter-frame
-				collmd->current_xnew = MEM_dupallocN(collmd->x); // inter-frame
-				collmd->current_v = MEM_dupallocN(collmd->x); // inter-frame
-
-				collmd->mvert_num = mvert_num;
-				
-				DM_ensure_looptri(dm);
-
-				collmd->tri_num = dm->getNumLoopTri(dm);
-				{
-					const MLoop *mloop = dm->getLoopArray(dm);
-					const MLoopTri *looptri = dm->getLoopTriArray(dm);
-					MVertTri *tri = MEM_mallocN(sizeof(*tri) * collmd->tri_num, __func__);
-					DM_verttri_from_looptri(tri, mloop, looptri, collmd->tri_num);
-					collmd->tri = tri;
-				}
+			collmd->x = dm->dupVertArray(dm); /* frame start position */
 
-				/* create bounding box hierarchy */
-				collmd->bvhtree = bvhtree_build_from_mvert(
-				        collmd->x,
-				        collmd->tri, collmd->tri_num,
-				        ob->pd->pdef_sboft);
+			for (i = 0; i < mvert_num; i++) {
+				/* we save global positions */
+				mul_m4_v3(ob->obmat, collmd->x[i].co);
+			}
+
+			collmd->xnew = MEM_dupallocN(collmd->x); // frame end position
+			collmd->current_x = MEM_dupallocN(collmd->x); // inter-frame
+			collmd->current_xnew = MEM_dupallocN(collmd->x); // inter-frame
+			collmd->current_v = MEM_dupallocN(collmd->x); // inter-frame
+
+			collmd->mvert_num = mvert_num;
 
-				collmd->time_x = collmd->time_xnew = current_time;
-				collmd->is_static = true;
+			DM_ensure_looptri(dm);
+
+			collmd->tri_num = dm->getNumLoopTri(dm);
+			{
+				const MLoop *mloop = dm->getLoopArray(dm);
+				const MLoopTri *looptri = dm->getLoopTriArray(dm);
+				MVertTri *tri = MEM_mallocN(sizeof(*tri) * collmd->tri_num, __func__);
+				DM_verttri_from_looptri(tri, mloop, looptri, collmd->tri_num);
+				collmd->tri = tri;
 			}
-			else if (mvert_num == collmd->mvert_num) {
-				/* put positions to old positions */
-				tempVert = collmd->x;
-				collmd->x = collmd->xnew;
-				collmd->xnew = tempVert;
-				collmd->time_x = collmd->time_xnew;
 
-				memcpy(collmd->xnew, dm->getVertArray(dm), mvert_num * sizeof(MVert));
+			/* create bounding box hierarchy */
+			collmd->bvhtree = bvhtree_build_from_mvert(
+					collmd->x,
+					collmd->tri, collmd->tri_num,
+					ob->pd->pdef_sboft);
 
-				bool is_static = true;
+			collmd->time_x = collmd->time_xnew = current_time;
+			collmd->is_static = true;
+		}
+		else if (mvert_num == collmd->mvert_num) {
+			/* put positions to old positions */
+			tempVert = collmd->x;
+			collmd->x = collmd->xnew;
+			collmd->xnew = tempVert;
+			collmd->time_x = collmd->time_xnew;
 
-				for (i = 0; i < mvert_num; i++) {
-					/* we save global positions */
-					mul_m4_v3(ob->obmat, collmd->xnew[i].co);
+			memcpy(collmd->xnew, dm->getVertArray(dm), mvert_num * sizeof(MVert));
 
-					/* detect motion */
-					is_static = is_static && equals_v3v3(collmd->x[i].co, collmd->xnew[i].co);
-				}
+			bool is_static = true;
 
-				memcpy(collmd->current_xnew, collmd->x, mvert_num * sizeof(MVert));
-				memcpy(collmd->current_x, collmd->x, mvert_num * sizeof(MVert));
-
-				/* check if GUI setting has changed for bvh */
-				if (collmd->bvhtree) {
-					if (ob->pd->pdef_sboft != BLI_bvhtree_get_epsilon(collmd->bvhtree)) {
-						BLI_bvhtree_free(collmd->bvhtree);
-						collmd->bvhtree = bvhtree_build_from_mvert(
-						        collmd->current_x,
-						        collmd->tri, collmd->tri_num,
-						        ob->pd->pdef_sboft);
-					}
-			
-				}
-				
-				/* happens on file load (ONLY when i decomment changes in readfile.c) */
-				if (!collmd->bvhtree) {
-					collmd->bvhtree = bvhtree_build_from_mvert(
-					        collmd->current_x,
-					        collmd->tri, collmd->tri_num,
-					        ob->pd->pdef_sboft);
-				}
-				else if (!collmd->is_static || !is_static) {
-					/* recalc static bounding boxes */
-					bvhtree_update_from_mvert(
-					        collmd->bvhtree,
-					        collmd->current_x, collmd->current_xnew,
-					        collmd->tri, collmd->tri_num,
-					        true);
-				}
+			for (i = 0; i < mvert_num; i++) {
+				/* we save global positions */
+				mul_m4_v3(ob->obmat, collmd->xnew[i].co);
 
-				collmd->is_static = is_static;
-				collmd->time_xnew = current_time;
+				/* detect motion */
+				is_static = is_static && equals_v3v3(collmd->x[i].co, collmd->xnew[i].co);
 			}
-			else if (mvert_num != collmd->mvert_num) {
-				freeData((ModifierData *)collmd);
+
+			memcpy(collmd->current_xnew, collmd->x, mvert_num * sizeof(MVert));
+			memcpy(collmd->current_x, collmd->x, mvert_num * sizeof(MVert));
+
+			/* check if GUI setting has changed for bvh */
+			if (collmd->bvhtree) {
+				if (ob->pd->pdef_sboft != BLI_bvhtree_get_epsilon(collmd->bvhtree)) {
+					BLI_bvhtree_free(collmd->bvhtree);
+					collmd->bvhtree = bvhtree_build_from_mvert(
+							collmd->current_x,
+							collmd->tri, collmd->tri_num,
+							ob->pd->pdef_sboft);
+				}
 			}
 			
+			/* happens on file load (ONLY when i decomment changes in readfile.c) */
+			if (!collmd->bvhtree) {
+				collmd->bvhtree = bvhtree_build_from_mvert(
+						collmd->current_x,
+						collmd->tri, collmd->tri_num,
+						ob->pd->pdef_sboft);
+			}
+			else if (!collmd->is_static || !is_static) {
+				/* recalc static bounding boxes */
+				bvhtree_update_from_mvert(
+						collmd->bvhtree,
+						collmd->current_x, collmd->current_xnew,
+						collmd->tri, collmd->tri_num,
+						true);
+			}
+
+			collmd->is_static = is_static;
+			collmd->time_xnew = current_time;
 		}
-		else if (current_time < collmd->time_xnew) {
+		else if (mvert_num != collmd->mvert_num) {
 			freeData((ModifierData *)collmd);
 		}
-		else {
-			if (mvert_num != collmd->mvert_num) {
-				freeData((ModifierData *)collmd);
-			}
-		}
 	}
 	
 	if (dm)




More information about the Bf-blender-cvs mailing list