[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13404] branches/cloth/blender/source/ blender: Weekend commit -> New: 3rd tab for advanced users mit many things to play with.

Daniel Genrich daniel.genrich at gmx.net
Fri Jan 25 17:14:55 CET 2008


Revision: 13404
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13404
Author:   genscher
Date:     2008-01-25 17:14:54 +0100 (Fri, 25 Jan 2008)

Log Message:
-----------
Weekend commit -> New: 3rd tab for advanced users mit many things to play with. Fixed: Free modifier correctly when deactivating cloth on panel, be carefull: could eventually put weird values on the GUI due to changed DNA

Modified Paths:
--------------
    branches/cloth/blender/source/blender/blenkernel/BKE_cloth.h
    branches/cloth/blender/source/blender/blenkernel/intern/cloth.c
    branches/cloth/blender/source/blender/blenkernel/intern/collision.c
    branches/cloth/blender/source/blender/blenkernel/intern/implicit.c
    branches/cloth/blender/source/blender/makesdna/DNA_cloth_types.h
    branches/cloth/blender/source/blender/src/buttons_object.c
    branches/cloth/blender/source/blender/src/vpaint.c

Modified: branches/cloth/blender/source/blender/blenkernel/BKE_cloth.h
===================================================================
--- branches/cloth/blender/source/blender/blenkernel/BKE_cloth.h	2008-01-25 15:31:43 UTC (rev 13403)
+++ branches/cloth/blender/source/blender/blenkernel/BKE_cloth.h	2008-01-25 16:14:54 UTC (rev 13404)
@@ -80,7 +80,10 @@
 	float 	goal;		/* goal, from SB			*/
 	float	impulse[3];	/* used in collision.c */
 	unsigned int impulse_count; /* same as above */
-	float avg_spring_len; /* average length of connected springs, UNUSED ATM */
+	float 	avg_spring_len; /* average length of connected springs, UNUSED ATM */
+	float 	struct_stiff;
+	float	bend_stiff;
+	float 	shear_stiff;
 }
 ClothVertex;
 
@@ -99,6 +102,7 @@
 	float dfdx[3][3];
 	float dfdv[3][3];
 	float f[3];
+	float 	stiffness;	/* stiffness factor from the vertex groups */
 }
 ClothSpring;
 
@@ -135,6 +139,7 @@
     CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT = ( 1 << 5 ), // true if tearing is enabled
     CLOTH_SIMSETTINGS_FLAG_NEW = ( 1 << 6 ), 	// unsued, true if cloth was just enabled
     CLOTH_SIMSETTINGS_FLAG_CCACHE_FFREE = (1 << 7), /* force cache freeing */
+    CLOTH_SIMSETTINGS_FLAG_SCALING = (1 << 8), /* is advanced scaling active? */
 } CLOTH_SIMSETTINGS_FLAGS;
 
 /* COLLISION FLAGS */

Modified: branches/cloth/blender/source/blender/blenkernel/intern/cloth.c
===================================================================
--- branches/cloth/blender/source/blender/blenkernel/intern/cloth.c	2008-01-25 15:31:43 UTC (rev 13403)
+++ branches/cloth/blender/source/blender/blenkernel/intern/cloth.c	2008-01-25 16:14:54 UTC (rev 13404)
@@ -125,7 +125,7 @@
 static void cloth_from_mesh ( Object *ob, ClothModifierData *clmd, DerivedMesh *dm );
 static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *dm, float framenr);
 int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm );
-static void cloth_apply_vgroup ( ClothModifierData *clmd, DerivedMesh *dm, short vgroup );
+static void cloth_apply_vgroup ( ClothModifierData *clmd, DerivedMesh *dm, short vgroup, int mode );
 
 
 /******************************************************************************
@@ -162,10 +162,11 @@
 	clmd->sim_parms->vgroup_mass = 0;
 	clmd->sim_parms->lastcachedframe = 0;
 	clmd->sim_parms->editedframe = 0;
+	clmd->sim_parms->autoprotect = 10;
 	
 	clmd->coll_parms->self_friction = 5.0;
 	clmd->coll_parms->friction = 10.0;
-	clmd->coll_parms->loop_count = 1;
+	clmd->coll_parms->loop_count = 5;
 	clmd->coll_parms->epsilon = 0.01f;
 	clmd->coll_parms->flags = CLOTH_COLLSETTINGS_FLAG_ENABLED;
 
@@ -482,8 +483,6 @@
 	return result;
 }
 
-
-
 int modifiers_indexInObject(Object *ob, ModifierData *md_seek);
 
 int cloth_read_cache(Object *ob, ClothModifierData *clmd, float framenr)
@@ -522,10 +521,10 @@
 		}
 		
 		fclose(fp);
-		
-		if(clmd->sim_parms->solver_type == 0)
-			implicit_set_positions(clmd);
 	}
+	
+	if(clmd->sim_parms->solver_type == 0)
+		implicit_set_positions(clmd);
 		
 	return ret;
 }
@@ -655,6 +654,14 @@
 	{	
 		cloth_free_modifier (ob, clmd);
 	}
+	
+	// sanity check for correctness of GUI values
+	if(clmd->sim_parms->max_struct<clmd->sim_parms->structural)
+		clmd->sim_parms->max_struct=clmd->sim_parms->structural;
+	if(clmd->sim_parms->max_bend<clmd->sim_parms->bending)
+		clmd->sim_parms->max_struct=clmd->sim_parms->bending;
+	if(clmd->sim_parms->max_shear<clmd->sim_parms->shear)
+		clmd->sim_parms->max_shear=clmd->sim_parms->shear;
 
 	if ( deltaTime == 1.0f )
 	{
@@ -693,7 +700,7 @@
 					VECCOPY ( verts->xconst, mvert[i].co );
 					Mat4MulVecfl ( ob->obmat, verts->xconst );
 				}
-
+				
 				tstart();
 
 				// Call the solver.
@@ -704,6 +711,10 @@
 				// printf ( "Cloth simulation time: %f\n", ( float ) tval() );
 
 				cloth_write_cache(ob, clmd, framenr);
+				
+				// check for autoprotection
+				if(framenr >= clmd->sim_parms->autoprotect)
+					clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT;
 			}
 			
 			// Copy the result back to the object.
@@ -897,7 +908,8 @@
 * cloth_apply_vgroup - applies a vertex group as specified by type
 *
 **/
-static void cloth_apply_vgroup ( ClothModifierData *clmd, DerivedMesh *dm, short vgroup )
+/* can be optimized to do all groups in one loop */
+static void cloth_apply_vgroup ( ClothModifierData *clmd, DerivedMesh *dm, short vgroup, int mode )
 {
 	unsigned int i = 0;
 	unsigned int j = 0;
@@ -922,7 +934,7 @@
 	for ( i = 0; i < numverts; i++, verts++ )
 	{
 		// LATER ON, support also mass painting here
-		if ( clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL )
+		if ((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL )||(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SCALING))
 		{
 			dvert = dm->getVertData ( dm, i, CD_MDEFORMVERT );
 			if ( dvert )
@@ -931,25 +943,37 @@
 				{
 					if ( dvert->dw[j].def_nr == vgroup )
 					{
-						verts->goal = dvert->dw [j].weight;
-
-						goalfac= 1.0f;
+						if (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL )
+						{
+							verts->goal = dvert->dw [j].weight;
+							goalfac= 1.0f;
+							
+							/*
+							// Kicking goal factor to simplify things...who uses that anyway?
+							// ABS ( clmd->sim_parms->maxgoal - clmd->sim_parms->mingoal );
+							*/
+							
+							verts->goal  = ( float ) pow ( verts->goal , 4.0f );
+							if ( verts->goal >=SOFTGOALSNAP )
+								verts->flags |= CLOTH_VERT_FLAG_PINNED;
+							
+							break;
+						}
 						
-						/*
-						// Kicking goal factor to simplify things...who uses that anyway?
-						// ABS ( clmd->sim_parms->maxgoal - clmd->sim_parms->mingoal );
-						*/
-						
-						verts->goal  = ( float ) pow ( verts->goal , 4.0f );
-
-						if ( verts->goal >=SOFTGOALSNAP )
+						if (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SCALING )
 						{
-							verts->flags |= CLOTH_VERT_FLAG_PINNED;
+							if(mode==2)
+							{
+								verts->struct_stiff = dvert->dw [j].weight;
+								verts->shear_stiff = dvert->dw [j].weight;
+							}
+							else if(mode==1)
+							{
+								verts->bend_stiff = dvert->dw [j].weight;
+							}
+							break;
 						}
 
-						// TODO enable mass painting here, for the moment i let "goals" go first
-
-						break;
 					}
 				}
 			}
@@ -1044,7 +1068,15 @@
 
 		// apply / set vertex groups
 		if ( clmd->sim_parms->vgroup_mass > 0 )
-			cloth_apply_vgroup ( clmd, dm, clmd->sim_parms->vgroup_mass );
+			cloth_apply_vgroup ( clmd, dm, clmd->sim_parms->vgroup_mass, 0 );
+		
+		// apply / set vertex groups
+		if ( clmd->sim_parms->vgroup_bend > 0 )
+			cloth_apply_vgroup ( clmd, dm, clmd->sim_parms->vgroup_bend, 1 );
+		
+		// apply / set vertex groups
+		if ( clmd->sim_parms->vgroup_struct > 0 )
+			cloth_apply_vgroup ( clmd, dm, clmd->sim_parms->vgroup_struct, 2 );
 
 		// init our solver
 		if ( solvers [clmd->sim_parms->solver_type].init )
@@ -1181,6 +1213,7 @@
 			clmd->coll_parms->avg_spring_len += spring->restlen;
 			spring->type = CLOTH_SPRING_TYPE_STRUCTURAL;
 			spring->flags = 0;
+			spring->stiffness = (cloth->verts[spring->kl].struct_stiff + cloth->verts[spring->ij].struct_stiff) / 2.0;
 			struct_springs++;
 			
 			if(!i)
@@ -1203,6 +1236,7 @@
 		VECSUB ( temp, cloth->verts[spring->kl].x, cloth->verts[spring->ij].x );
 		spring->restlen =  sqrt ( INPR ( temp, temp ) );
 		spring->type = CLOTH_SPRING_TYPE_SHEAR;
+		spring->stiffness = (cloth->verts[spring->kl].shear_stiff + cloth->verts[spring->ij].shear_stiff) / 2.0;
 
 		BLI_linklist_append ( &edgelist[spring->ij], spring );
 		BLI_linklist_append ( &edgelist[spring->kl], spring );
@@ -1220,6 +1254,7 @@
 			VECSUB ( temp, cloth->verts[spring->kl].x, cloth->verts[spring->ij].x );
 			spring->restlen =  sqrt ( INPR ( temp, temp ) );
 			spring->type = CLOTH_SPRING_TYPE_SHEAR;
+			spring->stiffness = (cloth->verts[spring->kl].shear_stiff + cloth->verts[spring->ij].shear_stiff) / 2.0;
 
 			BLI_linklist_append ( &edgelist[spring->ij], spring );
 			BLI_linklist_append ( &edgelist[spring->kl], spring );
@@ -1257,6 +1292,7 @@
 				VECSUB ( temp, cloth->verts[index2].x, cloth->verts[tspring2->ij].x );
 				spring->restlen =  sqrt ( INPR ( temp, temp ) );
 				spring->type = CLOTH_SPRING_TYPE_BENDING;
+				spring->stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0;
 				BLI_edgehash_insert ( edgehash, spring->ij, index2, NULL );
 				bend_springs++;
 

Modified: branches/cloth/blender/source/blender/blenkernel/intern/collision.c
===================================================================
--- branches/cloth/blender/source/blender/blenkernel/intern/collision.c	2008-01-25 15:31:43 UTC (rev 13403)
+++ branches/cloth/blender/source/blender/blenkernel/intern/collision.c	2008-01-25 16:14:54 UTC (rev 13404)
@@ -978,9 +978,6 @@
 	cloth_collision_moving_tris(coll_clmd, clmd, tree2, tree1);
 }
 
-// CLOTH_MAX_THRESHOLD defines how much collision rounds/loops should be taken
-#define CLOTH_MAX_THRESHOLD 10
-
 // cloth - object collisions
 int cloth_bvh_objcollision(ClothModifierData * clmd, float step, float dt)
 {
@@ -1092,7 +1089,7 @@
 		}
 		rounds++;
 	}
-	while(result && (CLOTH_MAX_THRESHOLD>rounds));
+	while(result && (clmd->coll_parms->loop_count>rounds));
 	
 	////////////////////////////////////////////////////////////
 	// update positions

Modified: branches/cloth/blender/source/blender/blenkernel/intern/implicit.c
===================================================================
--- branches/cloth/blender/source/blender/blenkernel/intern/implicit.c	2008-01-25 15:31:43 UTC (rev 13403)
+++ branches/cloth/blender/source/blender/blenkernel/intern/implicit.c	2008-01-25 16:14:54 UTC (rev 13404)
@@ -1091,6 +1091,8 @@
 	float damping_force[3] = {0,0,0};
 	float nulldfdx[3][3]={ {0,0,0}, {0,0,0}, {0,0,0}};
 	
+	float scaling = 0.0;
+	
 	VECCOPY(s->f, nullf);
 	cp_fmatrix(s->dfdx, nulldfdx);
 	cp_fmatrix(s->dfdv, nulldfdx);
@@ -1122,16 +1124,18 @@
 		mul_fvector_S(dir, extent, 0.0f);
 	}
 	
-	
 	// calculate force of structural + shear springs
 	if(s->type != CLOTH_SPRING_TYPE_BENDING)
 	{
 		if(length > L) // only on elonglation
 		{
 			s->flags |= CLOTH_SPRING_FLAG_NEEDED;
+			
+			k = clmd->sim_parms->structural;
+				
+			scaling = k + s->stiffness * (clmd->sim_parms->max_struct-k);
+			k = scaling;
 
-			k = clmd->sim_parms->structural;	
-
 			mul_fvector_S(stretch_force, dir, (k*(length-L))); 
 
 			VECADD(s->f, s->f, stretch_force);
@@ -1152,6 +1156,9 @@
 			s->flags |= CLOTH_SPRING_FLAG_NEEDED;
 			

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list