[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28490] branches/render25/source/blender/ blenkernel: hair update

Joseph Eagar joeedh at gmail.com
Wed Apr 28 15:43:49 CEST 2010


Revision: 28490
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28490
Author:   joeedh
Date:     2010-04-28 15:43:49 +0200 (Wed, 28 Apr 2010)

Log Message:
-----------
hair update

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

Modified: branches/render25/source/blender/blenkernel/BKE_collision.h
===================================================================
--- branches/render25/source/blender/blenkernel/BKE_collision.h	2010-04-28 11:06:37 UTC (rev 28489)
+++ branches/render25/source/blender/blenkernel/BKE_collision.h	2010-04-28 13:43:49 UTC (rev 28490)
@@ -131,7 +131,7 @@
 
 // move Collision modifier object inter-frame with step = [0,1]
 // defined in collisions.c
-void collision_move_object ( CollisionModifierData *collmd, float step, float prevstep );
+void collision_move_object (CollisionModifierData *collmd, float step, float prevstep, float dt);
 
 // interface for collision functions
 void collisions_compute_barycentric ( float pv[3], float p1[3], float p2[3], float p3[3], float *w1, float *w2, float *w3 );

Modified: branches/render25/source/blender/blenkernel/intern/collision.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/collision.c	2010-04-28 11:06:37 UTC (rev 28489)
+++ branches/render25/source/blender/blenkernel/intern/collision.c	2010-04-28 13:43:49 UTC (rev 28490)
@@ -56,22 +56,39 @@
 Collision modifier code start
 ***********************************/
 
+/* step is limited from -[time step] (frame start position) to 1 (frame end position) */
+
 /* step is limited from 0 (frame start position) to 1 (frame end position) */
-void collision_move_object ( CollisionModifierData *collmd, float step, float prevstep )
+void collision_move_object (CollisionModifierData *collmd, float step, float prevstep, float dt)
 {
-	float tv[3] = {0,0,0};
+	float tv[3] = {0, 0, 0};
 	unsigned int i = 0;
 
-	for ( i = 0; i < collmd->numverts; i++ )
-	{
-		VECSUB ( 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 );
-		VECSUB ( collmd->current_v[i].co, collmd->current_xnew[i].co, collmd->current_x[i].co );
+	if (prevstep < 0.0) {
+		for ( i = 0; i < collmd->numverts; i++ )
+		{
+			VECSUB ( tv, collmd->xold[i].co, collmd->x[i].co );
+			VECADDS( collmd->current_x[i].co, collmd->x[i].co, tv, prevstep );
+
+			VECSUB ( tv, collmd->xnew[i].co, collmd->x[i].co );
+			VECADDS( collmd->current_x[i].co, collmd->x[i].co, tv, prevstep );
+
+			VECSUB ( collmd->current_v[i].co, collmd->current_xnew[i].co, collmd->current_x[i].co );
+		}
+	} else {
+		for ( i = 0; i < collmd->numverts; i++ )
+		{
+			VECSUB ( 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 );
+			VECSUB ( collmd->current_v[i].co, collmd->current_xnew[i].co, collmd->current_x[i].co );
+		}
 	}
-	bvhtree_update_from_mvert ( collmd->bvhtree, collmd->mfaces, collmd->numfaces, collmd->current_x, collmd->current_xnew, collmd->numverts, 1 );
+
+	bvhtree_update_from_mvert(collmd->bvhtree, collmd->mfaces, collmd->numfaces, collmd->current_x, collmd->current_xnew, collmd->numverts, 1);
 }
 
+
 BVHTree *bvhtree_build_from_mvert ( MFace *mfaces, unsigned int numfaces, MVert *x, unsigned int numverts, float epsilon )
 {
 	BVHTree *tree;
@@ -1380,7 +1397,7 @@
 		col->ob = ob;
 		col->collmd = cmd;
 		/* make sure collider is properly set up */
-		collision_move_object(cmd, 1.0, 0.0);
+		collision_move_object(cmd, 1.0, 0.0, 1.0);
 		BLI_addtail(*objs, col);
 	}
 
@@ -1437,11 +1454,13 @@
 	}
 }
 
+#define SIGN(n) ((n) < 0.0f ? -1 : 1)
+
 static int cloth_bvh_edge_objcollisions_nearcheck(ClothModifierData *clmd, CollisionModifierData *collmd, int result, BVHTreeOverlap *overlap, float dt)
 {
 	Cloth *cloth = clmd->clothObject;
 	ClothVertex *cv;
-	float *dis = MEM_callocN(sizeof(float)*cloth->numverts, "coll point distancers");
+	float (*dis)[2] = MEM_callocN(sizeof(float)*2*cloth->numverts, "coll point distancers");
 	float lambda, dot, lambda2, uv[2], uv2[2], epsilon;
 	MFace **frefs = MEM_callocN(sizeof(void*)*clmd->clothObject->numverts, "coll indices");
 	int i, j, ret = 0;
@@ -1479,8 +1498,8 @@
 
 		normalize_v3(no);
 
-		if (isect_ray_tri_v3(cv->tx, no, v1, v2, v3, &lambda, uv) ||
-			(mf->v4 && isect_ray_tri_v3(cv->tx, vec, v1, v3, v4, &lambda, uv)))
+		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);
@@ -1488,23 +1507,23 @@
 			VECCOPY(ov3, collmd->current_x[mf->v3].co);
 
 			normal_tri_v3(no, ov1, ov2, ov3);
-			mul_v3_fl(no, epsilon);
 
-			add_v3_v3(ov1, no);
-			add_v3_v3(ov2, no);
-			add_v3_v3(ov3, no);
+			sub_v3_v3v3(vec, cv->txold, ov1);
+			normalize_v3(vec);
+			if (dot_v3v3(vec, no) < FLT_EPSILON) {
+				continue;
+			}
 
-			normalize_v3(no);
 			mul_v3_fl(no, -1.0);
+			isect_ray_tri_plane_v3(cv->txold, no, ov1, ov2, ov3, &lambda2, uv);
 
-			isect_ray_tri_plane_v3(cv->txold, no, ov1, ov2, ov3, &lambda, uv);
-
-			if (lambda < 0.0)
+			if (lambda2 < 0.0)
 				continue;
 
-			if (!frefs[j] || fabs(lambda) < dis[j]) {
+			if (!frefs[j] || fabs(lambda2) < dis[j][0]) {
 				frefs[j] = mf;
-				dis[j] = lambda;
+				dis[j][0] = fabs(lambda2);
+				dis[j][1] = fabs(lambda);
 			}
 		}
 	}
@@ -1517,7 +1536,7 @@
 		if (!frefs[i])
 			continue;
 
-		lambda = dis[i];
+		lambda = dis[i][1];
 		mf = frefs[i];
 		ret += 1;
 
@@ -1550,22 +1569,24 @@
 		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)))
 		{
-			float frictionfac = clmd->coll_parms->friction*0.01;
+			float frictionfac = clmd->coll_parms->friction*0.01, oldno[3];
 
 			/*absurdly simplistic linear interpolation formula, heh*/
+			VECCOPY(oldno, no);
 			sub_v3_v3(vec, no);
 			mul_v3_fl(vec, frictionfac);
 			add_v3_v3(no, vec);
 			lambda += (lambda2 - lambda) * frictionfac;
-		}
-		
-		if (lambda < 0.0)
-			lambda = 0.0;
 
-		mul_v3_fl(no, lambda*dt);
+			normalize_v3(no);
+			reflect_v3_v3v3(vec, no, oldno);
+			normalize_v3(vec);
+		} else VECCOPY(vec, no);
+
+		mul_v3_fl(no, lambda*2);
+
 		add_v3_v3(cv->tx, no);
-
-		sub_v3_v3v3(cv->tv, cv->tx, cv->txold);
+		VECCOPY(cv->txold, cv->tx);
 	}
 
 	MEM_freeN(frefs);
@@ -1674,7 +1695,7 @@
 				continue;
 			
 			/* move object to position (step) in time */
-			collision_move_object ( collmd, step + dt, step );
+			collision_move_object ( collmd, step+dt, step, dt );
 			
 			/* search for overlapping collision pairs */
 			overlap = BLI_bvhtree_overlap ( cloth_bvh, collmd->bvhtree, &result );
@@ -1737,7 +1758,9 @@
 				}
 			}
 
-			VECADD ( verts[i].tx, verts[i].txold, verts[i].tv );
+			if (!verts[i].isolated) {
+				VECADD ( verts[i].tx, verts[i].txold, verts[i].tv );
+			}
 		}
 		////////////////////////////////////////////////////////////
 		
@@ -1845,7 +1868,9 @@
 				{
 					if ( ! ( verts [i].flags & CLOTH_VERT_FLAG_PINNED ) )
 					{
-						VECSUB ( verts[i].tv, verts[i].tx, verts[i].txold );
+						if (!verts[i].isolated) {
+							VECSUB ( verts[i].tv, verts[i].tx, verts[i].txold );
+						}
 					}
 				}
 			}

Modified: branches/render25/source/blender/blenkernel/intern/implicit.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/implicit.c	2010-04-28 11:06:37 UTC (rev 28489)
+++ branches/render25/source/blender/blenkernel/intern/implicit.c	2010-04-28 13:43:49 UTC (rev 28490)
@@ -1802,7 +1802,7 @@
 
 		add_v3_v3(v->tv, vec);
 
-		sub_v3_v3v3(v->txold, v->tx, v->tv);
+		add_v3_v3v3(v->tx, v->txold, v->tv);
 	}
 }
 
@@ -1892,15 +1892,15 @@
 				VECCOPY(verts[i].v, verts[i].tv);
 			}
 
+			//velocity rigid body damping
+			rigidbody_damping(clmd, dt/clmd->sim_parms->timescale);
+
 			// call collision function
 			// TODO: check if "step" or "step+dt" is correct - dg
 			if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED && clmd->clothObject->bvhtree) {
-				result = cloth_bvh_objcollision(ob, clmd, step/clmd->sim_parms->timescale, dt/clmd->sim_parms->timescale);
+				result = cloth_bvh_objcollision(ob, clmd, (step)/clmd->sim_parms->timescale, dt/clmd->sim_parms->timescale);
 			}
 
-			//velocity rigid body damping
-			rigidbody_damping(clmd, dt/clmd->sim_parms->timescale);
-			
 			// copy corrected positions back to simulation
 			for(i = 0; i < numverts; i++)
 			{		
@@ -1908,6 +1908,7 @@
 				if((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL) && (verts [i].flags & CLOTH_VERT_FLAG_PINNED))
 					continue;
 
+				VECSUB(verts[i].tv, verts[i].tx, verts[i].txold);
 				VECCOPY(id->Xnew[i], verts[i].tx);
 				VECCOPY(id->Vnew[i], verts[i].tv);
 				mul_v3_fl(id->Vnew[i], ((float)clmd->sim_parms->stepsPerFrame)); // /clmd->sim_parms->timescale);
@@ -1925,9 +1926,9 @@
 			cp_lfvector(id->V, id->Vnew, numverts);
 
 			// calculate
-			cloth_calc_force(clmd, frame, id->F, id->X, id->V, id->dFdV, id->dFdX, effectors, step+dt, id->M);
+			//cloth_calc_force(clmd, frame, id->F, id->X, id->V, id->dFdV, id->dFdX, effectors, step+dt, id->M);
 
-			simulate_implicit_euler(id->Vnew, id->X, id->V, id->F, id->dFdV, id->dFdX, dt/2, id->A, id->B, id->dV, id->S, id->z, id->olddV, id->P, id->Pinv, id->M, id->bigI);
+			//simulate_implicit_euler(id->Vnew, id->X, id->V, id->F, id->dFdV, id->dFdX, dt/2, id->A, id->B, id->dV, id->S, id->z, id->olddV, id->P, id->Pinv, id->M, id->bigI);
 		} else {
 			// X = Xnew;
 			cp_lfvector(id->X, id->Xnew, numverts);
@@ -1947,13 +1948,13 @@
 	{				
 		if((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL) && (verts [i].flags & CLOTH_VERT_FLAG_PINNED))
 		{
-			VECCOPY(verts[i].txold, verts[i].xconst); // TODO: test --> should be .x 
+			//VECCOPY(verts[i].txold, verts[i].xconst); // TODO: test --> should be .x
 			VECCOPY(verts[i].x, verts[i].xconst);
 			VECCOPY(verts[i].v, id->V[i]);
 		}
 		else
 		{
-			VECCOPY(verts[i].txold, id->X[i]);
+			//VECCOPY(verts[i].txold, id->X[i]);
 			VECCOPY(verts[i].x, id->X[i]);
 			VECCOPY(verts[i].v, id->V[i]);
 		}





More information about the Bf-blender-cvs mailing list