[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29004] branches/render25/source/blender/ blenkernel/intern/collision.c: Render Branch: for hair collisions, always treat quads as split into

Brecht Van Lommel brecht at blender.org
Wed May 26 17:59:45 CEST 2010


Revision: 29004
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29004
Author:   blendix
Date:     2010-05-26 17:59:45 +0200 (Wed, 26 May 2010)

Log Message:
-----------
Render Branch: for hair collisions, always treat quads as split into
triangles for intersections, solves some issues.

Modified Paths:
--------------
    branches/render25/source/blender/blenkernel/intern/collision.c

Modified: branches/render25/source/blender/blenkernel/intern/collision.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/collision.c	2010-05-26 11:25:33 UTC (rev 29003)
+++ branches/render25/source/blender/blenkernel/intern/collision.c	2010-05-26 15:59:45 UTC (rev 29004)
@@ -1447,15 +1447,17 @@
 	Cloth *cloth = clmd->clothObject;
 	ClothVertex *cv;
 	float (*dis)[2] = MEM_callocN(sizeof(float)*2*cloth->numverts, "coll point distancers");
-	float lambda, dot, lambda2, uv[2], uv2[2], epsilon;
+	float lambda, lambda2, uv[2], uv2[2], epsilon;
 	MFace **frefs = MEM_callocN(sizeof(void*)*clmd->clothObject->numverts, "coll indices");
+	int *fsides = MEM_callocN(sizeof(int)*clmd->clothObject->numverts, "coll sides");
 	int i, j, ret = 0;
 
 	epsilon = MAX2(clmd->coll_parms->epsilon, collmd->bvhtree ? BLI_bvhtree_getepsilon(collmd->bvhtree) : 0);
 
 	for (i=0; i<result; i++, overlap++) {
 		MFace *mf = collmd->mfaces + overlap->indexB;
-		float v1[3], v2[3], v3[3], v4[3], no[3], vec[3], ov1[3], ov2[3], ov3[3];
+		float v1[3], v2[3], v3[3], no[3], vec[3], ov1[3], ov2[3], ov3[3];
+		int side;
 
 		if (overlap->indexA < 0 || overlap->indexA >= cloth->numverts)
 			continue;
@@ -1465,51 +1467,59 @@
 		j = overlap->indexA;
 		cv = cloth->verts + overlap->indexA;
 
-		VECCOPY(v1, collmd->current_xnew[mf->v1].co);
-		VECCOPY(v2, collmd->current_xnew[mf->v2].co);
-		VECCOPY(v3, collmd->current_xnew[mf->v3].co);
-		if (mf->v4) {
-			VECCOPY(v4, collmd->current_xnew[mf->v4].co);
-			normal_quad_v3(no, v1, v2, v3, v4);
-		} else {
+		for(side=0; side < (mf->v4? 2: 1); side++) {
+			if(side == 0) {
+				copy_v3_v3(v1, collmd->current_xnew[mf->v1].co);
+				copy_v3_v3(v2, collmd->current_xnew[mf->v2].co);
+				copy_v3_v3(v3, collmd->current_xnew[mf->v3].co);
+			}
+			else {
+				copy_v3_v3(v1, collmd->current_xnew[mf->v1].co);
+				copy_v3_v3(v2, collmd->current_xnew[mf->v3].co);
+				copy_v3_v3(v3, collmd->current_xnew[mf->v4].co);
+			}
+
 			normal_tri_v3(no, v1, v2, v3);
-		}
+			mul_v3_fl(no, epsilon);
+			add_v3_v3(v1, no);
+			add_v3_v3(v2, no);
+			add_v3_v3(v3, no);
 
-		mul_v3_fl(no, epsilon);
-		add_v3_v3(v1, no);
-		add_v3_v3(v2, no);
-		add_v3_v3(v3, no);
-		if (mf->v4)
-			add_v3_v3(v4, no);
+			normalize_v3(no);
 
-		normalize_v3(no);
+			if(isect_ray_tri_plane_v3(cv->tx, no, v1, v2, v3, &lambda, uv)) {
+				/*we need to compute distance to the plane of the previous time step's face, not the current one*/
+				if(side == 0) {
+					copy_v3_v3(ov1, collmd->current_x[mf->v1].co);
+					copy_v3_v3(ov2, collmd->current_x[mf->v2].co);
+					copy_v3_v3(ov3, collmd->current_x[mf->v3].co);
+				}
+				else {
+					copy_v3_v3(ov1, collmd->current_x[mf->v1].co);
+					copy_v3_v3(ov2, collmd->current_x[mf->v3].co);
+					copy_v3_v3(ov3, collmd->current_x[mf->v4].co);
+				}
 
-		if (isect_ray_tri_plane_v3(cv->tx, no, v1, v2, v3, &lambda, uv) ||
-			(mf->v4 && isect_ray_tri_plane_v3(cv->tx, no, v1, v3, v4, &lambda, uv)))
-		{
-			/*we need to compute distance to the plane of the previous time step's face, not the current one*/
-			VECCOPY(ov1, collmd->current_x[mf->v1].co);
-			VECCOPY(ov2, collmd->current_x[mf->v2].co);
-			VECCOPY(ov3, collmd->current_x[mf->v3].co);
+				normal_tri_v3(no, ov1, ov2, ov3);
 
-			normal_tri_v3(no, ov1, ov2, ov3);
+				sub_v3_v3v3(vec, cv->txold, ov1);
+				normalize_v3(vec);
+				if (dot_v3v3(vec, no) < FLT_EPSILON) {
+					continue;
+				}
 
-			sub_v3_v3v3(vec, cv->txold, ov1);
-			normalize_v3(vec);
-			if (dot_v3v3(vec, no) < FLT_EPSILON) {
-				continue;
-			}
+				mul_v3_fl(no, -1.0);
+				isect_ray_tri_plane_v3(cv->txold, no, ov1, ov2, ov3, &lambda2, uv);
 
-			mul_v3_fl(no, -1.0);
-			isect_ray_tri_plane_v3(cv->txold, no, ov1, ov2, ov3, &lambda2, uv);
+				if (lambda2 < 0.0)
+					continue;
 
-			if (lambda2 < 0.0)
-				continue;
-
-			if (!frefs[j] || fabs(lambda2) < dis[j][0]) {
-				frefs[j] = mf;
-				dis[j][0] = fabs(lambda2);
-				dis[j][1] = fabs(lambda);
+				if (!frefs[j] || fabs(lambda2) < dis[j][0]) {
+					frefs[j] = mf;
+					fsides[j] = side;
+					dis[j][0] = fabs(lambda2);
+					dis[j][1] = fabs(lambda);
+				}
 			}
 		}
 	}
@@ -1517,48 +1527,49 @@
 	cv = cloth->verts;
 	for (i=0; i<cloth->numverts; i++, cv++) {
 		MFace *mf;
-		float v1[3], v2[3], v3[3], v4[3], no[3], vec[3];
+		float v1[3], v2[3], v3[3], no[3], vec[3];
+		int side;
 
 		if (!frefs[i])
 			continue;
 
 		lambda = dis[i][1];
 		mf = frefs[i];
+		side = fsides[i];
 		ret += 1;
 
-		VECCOPY(v1, collmd->current_xnew[mf->v1].co);
-		VECCOPY(v2, collmd->current_xnew[mf->v2].co);
-		VECCOPY(v3, collmd->current_xnew[mf->v3].co);
-		if (mf->v4) {
-			VECCOPY(v4, collmd->current_xnew[mf->v4].co);
-			normal_quad_v3(no, v1, v2, v3, v4);
-		} else {
-			normal_tri_v3(no, v1, v2, v3);
+		if(side == 0) {
+			copy_v3_v3(v1, collmd->current_xnew[mf->v1].co);
+			copy_v3_v3(v2, collmd->current_xnew[mf->v2].co);
+			copy_v3_v3(v3, collmd->current_xnew[mf->v3].co);
 		}
+		else {
+			copy_v3_v3(v1, collmd->current_xnew[mf->v1].co);
+			copy_v3_v3(v2, collmd->current_xnew[mf->v3].co);
+			copy_v3_v3(v3, collmd->current_xnew[mf->v4].co);
+		}
 
+		normal_tri_v3(no, v1, v2, v3);
 		mul_v3_fl(no, epsilon);
 		add_v3_v3(v1, no);
 		add_v3_v3(v2, no);
 		add_v3_v3(v3, no);
-		if (mf->v4)
-			add_v3_v3(v4, no);
 
 		normalize_v3(no);
 
-		VECCOPY(vec, cv->tv);
+		copy_v3_v3(vec, cv->tv);
 		mul_v3_fl(vec, -1.0f);
 
 		normalize_v3(vec);
-		dot = dot_v3v3(no, vec);
 
 		/*handle friction.  probably really stupid math here, no time for doing better though*/
-		if (isect_ray_tri_v3(cv->tx, vec, v1, v2, v3, &lambda2, uv2) ||
-			(mf->v4 && isect_ray_tri_v3(cv->tx, vec, v1, v3, v4, &lambda2, uv2)))
+		if((clmd->coll_parms->friction > 0.0f) &&
+		   isect_ray_tri_v3(cv->tx, vec, v1, v2, v3, &lambda2, uv2))
 		{
 			float frictionfac = clmd->coll_parms->friction*0.01, oldno[3];
 
 			/*absurdly simplistic linear interpolation formula, heh*/
-			VECCOPY(oldno, no);
+			copy_v3_v3(oldno, no);
 			sub_v3_v3(vec, no);
 			mul_v3_fl(vec, frictionfac);
 			add_v3_v3(no, vec);
@@ -1567,16 +1578,19 @@
 			normalize_v3(no);
 			reflect_v3_v3v3(vec, no, oldno);
 			normalize_v3(vec);
-		} else VECCOPY(vec, no);
+		}
+		/*else
+			copy_v3_v3(vec, no);*/
 
+		//mul_v3_fl(vec, lambda);
+		//add_v3_v3(cv->txold, vec);
+
 		mul_v3_fl(no, lambda);
-		mul_v3_fl(vec, lambda);
-
-		//add_v3_v3(cv->txold, vec);
 		add_v3_v3(cv->tv, no);
 	}
 
 	MEM_freeN(frefs);
+	MEM_freeN(fsides);
 	MEM_freeN(dis);
 
 	return ret;





More information about the Bf-blender-cvs mailing list