[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13604] trunk/blender/source/blender: Cloth: Hopefully fixed bug reported from bjornmose (2nd try)

Daniel Genrich daniel.genrich at gmx.net
Fri Feb 8 01:55:48 CET 2008


Revision: 13604
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13604
Author:   genscher
Date:     2008-02-08 01:55:48 +0100 (Fri, 08 Feb 2008)

Log Message:
-----------
Cloth: Hopefully fixed bug reported from bjornmose (2nd try)

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_cloth.h
    trunk/blender/source/blender/blenkernel/intern/cloth.c
    trunk/blender/source/blender/blenkernel/intern/implicit.c
    trunk/blender/source/blender/src/buttons_object.c

Modified: trunk/blender/source/blender/blenkernel/BKE_cloth.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_cloth.h	2008-02-07 16:29:08 UTC (rev 13603)
+++ trunk/blender/source/blender/blenkernel/BKE_cloth.h	2008-02-08 00:55:48 UTC (rev 13604)
@@ -65,6 +65,18 @@
 
 #define CLOTH_MAX_THREAD 2
 
+/* goal defines */
+#define SOFTGOALSNAP  0.999f
+
+/* This is approximately the smallest number that can be
+* represented by a float, given its precision. */
+#define ALMOST_ZERO		FLT_EPSILON
+
+/* Bits to or into the ClothVertex.flags. */
+#define CLOTH_VERT_FLAG_PINNED 1
+#define CLOTH_VERT_FLAG_COLLISION 2
+#define CLOTH_VERT_FLAG_PINNED_EM 3
+
 /**
  * The definition of a cloth vertex.
  */
@@ -108,13 +120,6 @@
 }
 ClothSpring;
 
-/* goal defines */
-#define SOFTGOALSNAP  0.999f
-
-/* This is approximately the smallest number that can be
-* represented by a float, given its precision. */
-#define ALMOST_ZERO		FLT_EPSILON
-
 // some macro enhancements for vector treatment
 #define VECADDADD(v1,v2,v3) 	{*(v1)+= *(v2) + *(v3); *(v1+1)+= *(v2+1) + *(v3+1); *(v1+2)+= *(v2+2) + *(v3+2);}
 #define VECSUBADD(v1,v2,v3) 	{*(v1)-= *(v2) + *(v3); *(v1+1)-= *(v2+1) + *(v3+1); *(v1+2)-= *(v2+2) + *(v3+2);}
@@ -139,24 +144,25 @@
 	CLOTH_SIMSETTINGS_FLAG_TEARING = ( 1 << 4 ),// true if tearing is enabled
 	CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT = ( 1 << 5 ), // true if tearing is enabled
 	CLOTH_SIMSETTINGS_FLAG_EDITMODE = ( 1 << 6 ), // are we in editmode? -several things disabled
-	CLOTH_SIMSETTINGS_FLAG_CCACHE_FFREE = (1 << 7), /* force cache freeing */
-	CLOTH_SIMSETTINGS_FLAG_SCALING = (1 << 8), /* is advanced scaling active? */
-	CLOTH_SIMSETTINGS_FLAG_LOADED = (1 << 9), /* did we just got load? */
+	CLOTH_SIMSETTINGS_FLAG_CCACHE_FFREE = ( 1 << 7 ), /* force cache freeing */
+	CLOTH_SIMSETTINGS_FLAG_SCALING = ( 1 << 8 ), /* is advanced scaling active? */
+	CLOTH_SIMSETTINGS_FLAG_LOADED = ( 1 << 9 ), /* did we just got load? */
 } CLOTH_SIMSETTINGS_FLAGS;
 
 /* COLLISION FLAGS */
 typedef enum
 {
 	CLOTH_COLLSETTINGS_FLAG_ENABLED = ( 1 << 1 ), /* enables cloth - object collisions */
-					    CLOTH_COLLSETTINGS_FLAG_SELF = ( 1 << 2 ), /* unused */
+	CLOTH_COLLSETTINGS_FLAG_SELF = ( 1 << 2 ), /* unused */
 } CLOTH_COLLISIONSETTINGS_FLAGS;
 
 /* Spring types as defined in the paper.*/
 typedef enum
 {
-	CLOTH_SPRING_TYPE_STRUCTURAL = 0,
- CLOTH_SPRING_TYPE_SHEAR,
- CLOTH_SPRING_TYPE_BENDING,
+	CLOTH_SPRING_TYPE_STRUCTURAL = 1,
+	CLOTH_SPRING_TYPE_SHEAR,
+	CLOTH_SPRING_TYPE_BENDING,
+	CLOTH_SPRING_TYPE_GOAL,
 } CLOTH_SPRING_TYPES;
 
 /* SPRING FLAGS */
@@ -166,11 +172,6 @@
 	CLOTH_SPRING_FLAG_NEEDED = ( 1 << 2 ), // springs has values to be applied
 } CLOTH_SPRINGS_FLAGS;
 
-/* Bits to or into the ClothVertex.flags. */
-#define CLOTH_VERT_FLAG_PINNED 1
-#define CLOTH_VERT_FLAG_COLLISION 2
-#define CLOTH_VERT_FLAG_PINNED_EM 3
-
 typedef void ( *CM_COLLISION_RESPONSE ) ( ClothModifierData *clmd, CollisionModifierData *collmd, CollisionTree *tree1, CollisionTree *tree2 );
 
 
@@ -189,7 +190,7 @@
 ////////////////////////////////////////////////
 // implicit.c
 ////////////////////////////////////////////////
-		
+
 // needed for cloth.c
 int implicit_init ( Object *ob, ClothModifierData *clmd );
 int implicit_free ( ClothModifierData *clmd );
@@ -197,7 +198,7 @@
 void implicit_set_positions ( ClothModifierData *clmd );
 
 // globally needed
-void clmdSetInterruptCallBack(int (*f)(void));
+void clmdSetInterruptCallBack ( int ( *f ) ( void ) );
 ////////////////////////////////////////////////
 
 
@@ -206,23 +207,26 @@
 ////////////////////////////////////////////////
 
 // needed for modifier.c
-void cloth_free_modifier_extern (ClothModifierData *clmd);
-void cloth_free_modifier (Object *ob, ClothModifierData *clmd);
-void cloth_init (ClothModifierData *clmd);
-DerivedMesh *clothModifier_do(ClothModifierData *clmd,Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc);
+void cloth_free_modifier_extern ( ClothModifierData *clmd );
+void cloth_free_modifier ( Object *ob, ClothModifierData *clmd );
+void cloth_init ( ClothModifierData *clmd );
+DerivedMesh *clothModifier_do ( ClothModifierData *clmd,Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc );
 
-void cloth_update_normals (ClothVertex *verts, int nVerts, MFace *face, int totface);
+void cloth_update_normals ( ClothVertex *verts, int nVerts, MFace *face, int totface );
 
 // needed for collision.c
-void bvh_update_from_cloth(ClothModifierData *clmd, int moving);
+void bvh_update_from_cloth ( ClothModifierData *clmd, int moving );
 
 // needed for editmesh.c
-void cloth_write_cache(Object *ob, ClothModifierData *clmd, float framenr);
-int cloth_read_cache(Object *ob, ClothModifierData *clmd, float framenr);
+void cloth_write_cache ( Object *ob, ClothModifierData *clmd, float framenr );
+int cloth_read_cache ( Object *ob, ClothModifierData *clmd, float framenr );
 
 // needed for button_object.c
-void cloth_clear_cache(Object *ob, ClothModifierData *clmd, float framenr);
+void cloth_clear_cache ( Object *ob, ClothModifierData *clmd, float framenr );
 
+// needed for cloth.c
+int cloth_add_spring ( ClothModifierData *clmd, unsigned int indexA, unsigned int indexB, float restlength, int spring_type);
+
 ////////////////////////////////////////////////
 
 
@@ -233,7 +237,8 @@
 
 /* This enum provides the IDs for our solvers. */
 // only one available in the moment
-typedef enum {
+typedef enum
+{
 	CM_IMPLICIT = 0,
 } CM_SOLVER_ID;
 

Modified: trunk/blender/source/blender/blenkernel/intern/cloth.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cloth.c	2008-02-07 16:29:08 UTC (rev 13603)
+++ trunk/blender/source/blender/blenkernel/intern/cloth.c	2008-02-08 00:55:48 UTC (rev 13604)
@@ -182,8 +182,8 @@
 	clmd->sim_parms->maxgoal = 1.0f;
 	clmd->sim_parms->mingoal = 0.0f;
 	clmd->sim_parms->defgoal = 0.0f;
-	clmd->sim_parms->goalspring = 100.0f;
-	clmd->sim_parms->goalfrict = 0.0f;
+	clmd->sim_parms->goalspring = 10.0f;
+	clmd->sim_parms->goalfrict = 5.0f;
 }
 
 
@@ -1035,7 +1035,6 @@
 	unsigned int numverts = dm->getNumVerts ( dm );
 	float goalfac = 0;
 	ClothVertex *verts = NULL;
-	// clmd->sim_parms->vgroup_mass
 
 	clothObj = clmd->clothObject;
 
@@ -1111,6 +1110,7 @@
 	ClothVertex *verts = NULL;
 	float tnull[3] = {0,0,0};
 	int cache_there = 0;
+	Cloth *cloth = NULL;
 
 	// If we have a clothObject, free it. 
 	if ( clmd->clothObject != NULL )
@@ -1126,6 +1126,7 @@
 	{
 		clmd->clothObject->old_solver_type = 255;
 		// clmd->clothObject->old_collision_type = 255;
+		cloth = clmd->clothObject;
 	}
 	else if ( !clmd->clothObject )
 	{
@@ -1200,6 +1201,13 @@
 		return 0;
 	}
 	
+	for ( i = 0; i < dm->getNumVerts(dm); i++)
+	{
+		if((!(cloth->verts[i].flags & CLOTH_VERT_FLAG_PINNED)) && (cloth->verts[i].goal > ALMOST_ZERO))
+		{
+			cloth_add_spring (clmd, i, i, 0.0, CLOTH_SPRING_TYPE_GOAL);
+		}
+	}
 	
 	// init our solver
 	if ( solvers [clmd->sim_parms->solver_type].init )
@@ -1273,10 +1281,11 @@
 		spring->restlen =  restlength;
 		spring->type = spring_type;
 		spring->flags = 0;
+		spring->stiffness = 0;
 		
 		cloth->numsprings++;
 	
-		BLI_linklist_append ( &cloth->springs, spring );
+		BLI_linklist_prepend ( &cloth->springs, spring );
 		
 		return 1;
 	}

Modified: trunk/blender/source/blender/blenkernel/intern/implicit.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/implicit.c	2008-02-07 16:29:08 UTC (rev 13603)
+++ trunk/blender/source/blender/blenkernel/intern/implicit.c	2008-02-08 00:55:48 UTC (rev 13604)
@@ -169,8 +169,9 @@
 /* simple v^T * v product with scalar ("outer product") */
 /* STATUS: HAS TO BE verified (*should* work) */
 DO_INLINE void mul_fvectorT_fvectorS(float to[3][3], float vectorA[3], float vectorB[3], float aS)
-{
+{	
 	mul_fvectorT_fvector(to, vectorA, vectorB);
+	
 	mul_fvector_S(to[0], to[0], aS);
 	mul_fvector_S(to[1], to[1], aS);
 	mul_fvector_S(to[2], to[2], aS);
@@ -811,6 +812,8 @@
 		
 		search = search->next;
 	}
+	
+	initdiag_bfmatrix(id->bigI, I);
 
 	for(i = 0; i < cloth->numverts; i++)
 	{		
@@ -989,7 +992,7 @@
 		
 	}
 }
-
+/*
 // version 1.3
 int cg_filtered_pre(lfVector *dv, fmatrix3x3 *lA, lfVector *lB, lfVector *z, fmatrix3x3 *S, fmatrix3x3 *P, fmatrix3x3 *Pinv)
 {
@@ -1053,6 +1056,110 @@
 	del_lfvector(p);
 	del_lfvector(r);
 	
+	printf("iterations: %d\n", iterations);
+	
+	return iterations<conjgrad_looplimit;
+}
+*/
+// version 1.4
+int cg_filtered_pre(lfVector *dv, fmatrix3x3 *lA, lfVector *lB, lfVector *z, fmatrix3x3 *S, fmatrix3x3 *P, fmatrix3x3 *Pinv, fmatrix3x3 *bigI)
+{
+	unsigned int numverts = lA[0].vcount, iterations = 0, conjgrad_looplimit=100;
+	float delta0 = 0, deltaNew = 0, deltaOld = 0, alpha = 0, tol = 0;
+	float conjgrad_epsilon=0.0001; // 0.2 is dt for steps=5
+	lfVector *r = create_lfvector(numverts);
+	lfVector *p = create_lfvector(numverts);
+	lfVector *s = create_lfvector(numverts);
+	lfVector *h = create_lfvector(numverts);
+	lfVector *bhat = create_lfvector(numverts);
+	lfVector *btemp = create_lfvector(numverts);
+	
+	BuildPPinv(lA, P, Pinv);
+	
+	initdiag_bfmatrix(bigI, I);
+	sub_bfmatrix_Smatrix(bigI, bigI, S);
+	
+	// x = Sx_0+(I-S)z
+	filter(dv, S);
+	add_lfvector_lfvector(dv, dv, z, numverts);
+	
+	// b_hat = S(b-A(I-S)z)
+	mul_bfmatrix_lfvector(r, lA, z);
+	mul_bfmatrix_lfvector(bhat, bigI, r);
+	sub_lfvector_lfvector(bhat, lB, bhat, numverts);
+	
+	// r = S(b-Ax)
+	mul_bfmatrix_lfvector(r, lA, dv);
+	sub_lfvector_lfvector(r, lB, r, numverts);
+	filter(r, S);
+	
+	// p = SP^-1r
+	mul_prevfmatrix_lfvector(p, Pinv, r);
+	filter(p, S);
+	
+	// delta0 = bhat^TP^-1bhat
+	mul_prevfmatrix_lfvector(btemp, Pinv, bhat);
+	delta0 = dot_lfvector(bhat, btemp, numverts);
+	
+	// deltaNew = r^TP
+	deltaNew = dot_lfvector(r, p, numverts);
+	
+	/*
+	filter(dv, S);
+	add_lfvector_lfvector(dv, dv, z, numverts);
+	
+	mul_bfmatrix_lfvector(r, lA, dv);
+	sub_lfvector_lfvector(r, lB, r, numverts);
+	filter(r, S);
+	
+	mul_prevfmatrix_lfvector(p, Pinv, r);
+	filter(p, S);
+	
+	deltaNew = dot_lfvector(r, p, numverts);
+	
+	delta0 = deltaNew * sqrt(conjgrad_epsilon);
+	*/
+	
+	// itstart();
+	
+	tol = (0.01*0.2);
+	
+	while ((deltaNew > delta0*tol*tol) && (iterations < conjgrad_looplimit))
+	{
+		iterations++;
+		
+		mul_bfmatrix_lfvector(s, lA, p);
+		filter(s, S);
+		
+		alpha = deltaNew / dot_lfvector(p, s, numverts);
+		

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list