[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28834] branches/render25/source/blender/ blenkernel/intern/implicit.c: Render Branch: some more code shuffling in the implicit solver:

Brecht Van Lommel brecht at blender.org
Tue May 18 17:24:04 CEST 2010


Revision: 28834
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28834
Author:   blendix
Date:     2010-05-18 17:24:04 +0200 (Tue, 18 May 2010)

Log Message:
-----------
Render Branch: some more code shuffling in the implicit solver:
* move force calc + implicit solve into separate function
* do the same for new goal code
* only run the second filtering solve in case it is needed
* only run rigid body damping in case it is enabled

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

Modified: branches/render25/source/blender/blenkernel/intern/implicit.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/implicit.c	2010-05-18 15:03:45 UTC (rev 28833)
+++ branches/render25/source/blender/blenkernel/intern/implicit.c	2010-05-18 15:24:04 UTC (rev 28834)
@@ -1579,9 +1579,6 @@
 
 	init_lfvector(lF, gravity, numverts);
 	
-	if(clmd->sim_parms->velocity_smooth > 0.0f || clmd->sim_parms->collider_friction > 0.0f)
-		hair_velocity_smoothing(clmd, lF, lX, lV, numverts);
-
 	/* multiply lF with mass matrix
 	// force = mass * acceleration (in this case: gravity)
 	*/
@@ -1909,18 +1906,61 @@
 	}
 }
 
+static void implicit_solve_forces(ClothModifierData *clmd, Implicit_Data *id, ListBase *effectors, float frame, float step, float dt)
+{
+	Cloth *cloth = clmd->clothObject;
+	ClothVertex *verts = cloth->verts;
+	LinkNode *springs = cloth->springs;
+	unsigned int numverts = cloth->numverts;
+	unsigned int numsprings = cloth->numsprings;
+
+	cloth_calc_force(clmd, frame, id->F, id->X, id->V, id->dFdV, id->dFdX, effectors, step, id->M, verts, springs, numverts, numsprings);
+
+	// velocity smoothing
+	if(clmd->sim_parms->velocity_smooth > 0.0f || clmd->sim_parms->collider_friction > 0.0f)
+		hair_velocity_smoothing(clmd, id->F, id->X, id->V, numverts);
+
+	// calculate new velocity
+	simulate_implicit_euler(id->Vnew, id->X, id->V, id->F, id->dFdV, id->dFdX, dt, id->A, id->B, id->dV, id->S, id->z, id->olddV, id->P, id->Pinv, id->M, id->bigI);
+}
+
+static int implicit_goal_new_code(ClothModifierData *clmd, ClothVertex *verts, int numverts, float spf, lfVector *X)
+{
+	int i;
+
+	if(!((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL) && clmd->sim_parms->goalspring != 0.0f))
+		return 0;
+
+	for(i = 0; i < numverts; i++)
+	{	
+		/*apply goal forces*/
+		if(!(verts [i].flags & CLOTH_VERT_FLAG_PINNED) && verts[i].goal != 0.0f)
+		{
+			float vec[3], fac;
+
+			fac = 1.0 - pow(1.0 - verts[i].goal*clmd->sim_parms->goalspring, 1.0 / spf);
+
+			sub_v3_v3v3(vec, verts[i].xconst, X[i]);
+			mul_v3_fl(vec, fac);
+
+			add_v3_v3(X[i], vec);
+		}
+	}
+
+	return 1;
+}
+
 int implicit_solver (Object *ob, float frame, ClothModifierData *clmd, ListBase *effectors)
 { 	 	
 	unsigned int i=0;
 	float step=0.0f, tf=clmd->sim_parms->timescale;
 	Cloth *cloth = clmd->clothObject;
 	ClothVertex *verts = cloth->verts;
-	LinkNode *springs = cloth->springs;
 	unsigned int numverts = cloth->numverts;
-	unsigned int numsprings = cloth->numsprings;
-	float dt = clmd->sim_parms->timescale / clmd->sim_parms->stepsPerFrame, spf = (float)clmd->sim_parms->stepsPerFrame / clmd->sim_parms->timescale;
+	float dt = clmd->sim_parms->timescale / clmd->sim_parms->stepsPerFrame;
+	float spf = (float)clmd->sim_parms->stepsPerFrame / clmd->sim_parms->timescale;
 	Implicit_Data *id = cloth->implicit;
-	int result = 0;
+	int result = 0, new_goal;
 
 	if(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL) /* do goal stuff */
 	{
@@ -1939,12 +1979,9 @@
 	
 	while(step < tf)
 	{	
-		// calculate forces
-		cloth_calc_force(clmd, frame, id->F, id->X, id->V, id->dFdV, id->dFdX, effectors, step, id->M, verts, springs, numverts, numsprings);
+		// calculate forces + do implicit solve
+		implicit_solve_forces(clmd, id, effectors, frame, step, dt);
 		
-		// calculate new velocity
-		simulate_implicit_euler(id->Vnew, id->X, id->V, id->F, id->dFdV, id->dFdX, dt, id->A, id->B, id->dV, id->S, id->z, id->olddV, id->P, id->Pinv, id->M, id->bigI);
-		
 		// advance positions
 		add_lfvector_lfvectorS(id->Xnew, id->X, id->Vnew, dt, numverts);
 		
@@ -1966,7 +2003,18 @@
 			VECCOPY(verts[i].txold, id->X[i]);
 		}
 
-		if(1)
+#ifndef CLOTH_GOAL_ORIGINAL
+		// new goal code, based on simply moving locations and assuming
+		// those changes get nice filtered by doing an extra implicit solve
+		// already use for collisions
+		new_goal = implicit_goal_new_code(clmd, verts, numverts, spf, id->Xnew);
+#else
+		new_goal = 0;
+#endif
+
+		// collision and velocity rigid body damping
+		if(((clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED) && clmd->clothObject->bvhtree) ||
+		   (clmd->sim_parms->rigid_damp > 0.0f) || new_goal)
 		{
 			// collisions 
 			// itstart();
@@ -1977,41 +2025,26 @@
 				VECCOPY(verts[i].txold, verts[i].tx);
 				VECCOPY(verts[i].tx, id->Xnew[i]);
 
-				/*apply goal forces*/
-#ifndef CLOTH_GOAL_ORIGINAL
-				if((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL) &&
-				   !(verts [i].flags & CLOTH_VERT_FLAG_PINNED))
-				{
-					float vec[3], fac;
-
-					fac = 1.0 - pow(1.0 - verts[i].goal*clmd->sim_parms->goalspring, 1.0 / spf);
-
-					sub_v3_v3v3(vec, verts[i].xconst, verts[i].tx);
-					mul_v3_fl(vec, fac);
-
-					add_v3_v3(verts[i].tx, vec);
-				}
-#endif
 				VECSUB(verts[i].tv, verts[i].tx, verts[i].txold);
 				VECCOPY(verts[i].v, verts[i].tv);
 			}
 
 			//velocity rigid body damping
-			if (clmd->clothObject->numfaces)
-				rigidbody_damping(clmd, dt/clmd->sim_parms->timescale);
-			else
-				hair_rigid_damping(clmd, dt/clmd->sim_parms->timescale);
+			if(clmd->sim_parms->rigid_damp > 0.0f) {
+				if (clmd->clothObject->numfaces)
+					rigidbody_damping(clmd, dt/clmd->sim_parms->timescale);
+				else
+					hair_rigid_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) {
+			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);
-			}
 
 			// copy corrected positions back to simulation
 			for(i = 0; i < numverts; i++)
 			{		
-					
 				if((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL) && (verts [i].flags & CLOTH_VERT_FLAG_PINNED))
 					continue;
 
@@ -2025,17 +2058,15 @@
 			cp_lfvector(id->X, id->Xnew, numverts);
 			
 			// if there were collisions, advance the velocity from v_n+1/2 to v_n+1
+			// also used now for filtering goal and rigid body damping changes now
 			
 			// V = Vnew;
 			cp_lfvector(id->V, id->Vnew, numverts);
 
-#if 1 //CLOTH_GOAL_ORIGINAL
-			// calculate
-			cloth_calc_force(clmd, frame, id->F, id->X, id->V, id->dFdV, id->dFdX, effectors, step+dt, id->M, verts, springs, numverts, numsprings);
-
-			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);
-#endif
-		} else {
+			// calculate forces + do implicit solve
+			implicit_solve_forces(clmd, id, effectors, frame, step+dt, dt/2);
+		}
+		else {
 			// X = Xnew;
 			cp_lfvector(id->X, id->Xnew, numverts);
 		}





More information about the Bf-blender-cvs mailing list