[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