[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12856] branches/cloth/blender/source/ blender: Fixed preconditioned conjugate to some degree but some issues left for stiffness >1000 (disabled therefore).
Daniel Genrich
daniel.genrich at gmx.net
Wed Dec 12 18:34:00 CET 2007
Revision: 12856
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12856
Author: genscher
Date: 2007-12-12 18:33:59 +0100 (Wed, 12 Dec 2007)
Log Message:
-----------
Fixed preconditioned conjugate to some degree but some issues left for stiffness>1000 (disabled therefore). There's also some issue with the springs function (some springs seem to be missing/not created)
Modified Paths:
--------------
branches/cloth/blender/source/blender/blenkernel/BKE_cloth.h
branches/cloth/blender/source/blender/blenkernel/BKE_pointcache.h
branches/cloth/blender/source/blender/blenkernel/SConscript
branches/cloth/blender/source/blender/blenkernel/intern/cloth.c
branches/cloth/blender/source/blender/blenkernel/intern/implicit.c
branches/cloth/blender/source/blender/blenkernel/intern/key.c
branches/cloth/blender/source/blender/blenkernel/intern/particle_system.c
branches/cloth/blender/source/blender/blenkernel/intern/pointcache.c
branches/cloth/blender/source/blender/makesdna/DNA_key_types.h
branches/cloth/blender/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c
branches/cloth/blender/source/blender/src/buttons_editing.c
branches/cloth/blender/source/blender/src/buttons_object.c
branches/cloth/blender/source/blender/src/drawview.c
branches/cloth/blender/source/blender/src/editkey.c
branches/cloth/blender/source/blender/src/editmesh_mods.c
branches/cloth/blender/source/blender/src/editparticle.c
Modified: branches/cloth/blender/source/blender/blenkernel/BKE_cloth.h
===================================================================
--- branches/cloth/blender/source/blender/blenkernel/BKE_cloth.h 2007-12-12 17:01:46 UTC (rev 12855)
+++ branches/cloth/blender/source/blender/blenkernel/BKE_cloth.h 2007-12-12 17:33:59 UTC (rev 12856)
@@ -200,7 +200,6 @@
// only one available in the moment
typedef enum {
CM_IMPLICIT = 0,
- CM_VERLET = 1,
} CM_SOLVER_ID;
Modified: branches/cloth/blender/source/blender/blenkernel/BKE_pointcache.h
===================================================================
--- branches/cloth/blender/source/blender/blenkernel/BKE_pointcache.h 2007-12-12 17:01:46 UTC (rev 12855)
+++ branches/cloth/blender/source/blender/blenkernel/BKE_pointcache.h 2007-12-12 17:33:59 UTC (rev 12856)
@@ -44,5 +44,6 @@
int BKE_ptcache_id_filename(struct ID *id, char *filename, int cfra, int stack_index, short do_path, short do_ext);
FILE * BKE_ptcache_id_fopen(struct ID *id, char mode, int cfra, int stack_index);
void BKE_ptcache_id_clear(struct ID *id, char mode, int cfra, int stack_index);
+int BKE_ptcache_id_exist(struct ID *id, int cfra, int stack_index);
#endif
Modified: branches/cloth/blender/source/blender/blenkernel/SConscript
===================================================================
--- branches/cloth/blender/source/blender/blenkernel/SConscript 2007-12-12 17:01:46 UTC (rev 12855)
+++ branches/cloth/blender/source/blender/blenkernel/SConscript 2007-12-12 17:33:59 UTC (rev 12856)
@@ -7,7 +7,7 @@
incs += ' ../python ../render/extern/include #/intern/decimation/extern'
incs += ' ../imbuf ../avi #/intern/elbeem/extern ../nodes'
incs += ' #/intern/iksolver/extern ../blenloader ../quicktime'
-incs += ' #/extern/bullet2/src '
+incs += ' #/extern/bullet2/src'
incs += ' #/intern/bmfont'
incs += ' ' + env['BF_OPENGL_INC']
Modified: branches/cloth/blender/source/blender/blenkernel/intern/cloth.c
===================================================================
--- branches/cloth/blender/source/blender/blenkernel/intern/cloth.c 2007-12-12 17:01:46 UTC (rev 12855)
+++ branches/cloth/blender/source/blender/blenkernel/intern/cloth.c 2007-12-12 17:33:59 UTC (rev 12856)
@@ -115,7 +115,6 @@
static CM_SOLVER_DEF solvers [] =
{
{ "Implicit", CM_IMPLICIT, implicit_init, implicit_solver, implicit_free },
- // { "Verlet", CM_VERLET, verlet_init, verlet_solver, verlet_free },
};
/* ********** cloth engine ******* */
@@ -477,8 +476,9 @@
fclose(fp);
}
- implicit_set_positions(clmd);
-
+ if(clmd->sim_parms->solver_type == 0)
+ implicit_set_positions(clmd);
+
return ret;
}
@@ -600,6 +600,7 @@
tstart();
/* Call the solver. */
+
if (solvers [clmd->sim_parms->solver_type].solver)
solvers [clmd->sim_parms->solver_type].solver (ob, framenr, clmd, effectors);
@@ -625,6 +626,10 @@
if(cloth_read_cache(ob, clmd, framenr))
cloth_to_object (ob, result, clmd);
}
+ else
+ {
+ cloth_clear_cache(ob, clmd, 0);
+ }
}
return result;
Modified: branches/cloth/blender/source/blender/blenkernel/intern/implicit.c
===================================================================
--- branches/cloth/blender/source/blender/blenkernel/intern/implicit.c 2007-12-12 17:01:46 UTC (rev 12855)
+++ branches/cloth/blender/source/blender/blenkernel/intern/implicit.c 2007-12-12 17:33:59 UTC (rev 12856)
@@ -241,7 +241,7 @@
unsigned int i = 0;
float temp = 0.0;
// schedule(guided, 2)
-#pragma omp parallel for reduction(+: temp)
+#pragma omp parallel for reduction(+: temp) private(i)
for(i = 0; i < verts; i++)
{
temp += INPR(fLongVectorA[i], fLongVectorB[i]);
@@ -558,6 +558,7 @@
mul_fmatrix_S(matrix[i].m, scalar);
}
}
+
/* SPARSE SYMMETRIC multiply big matrix with long vector*/
/* STATUS: verified */
DO_INLINE void mul_bfmatrix_lfvector( float (*to)[3], fmatrix3x3 *from, lfVector *fLongVector)
@@ -590,6 +591,20 @@
}
+
+
+/* SPARSE SYMMETRIC multiply big matrix with long vector (for diagonal preconditioner) */
+/* STATUS: verified */
+DO_INLINE void mul_prevfmatrix_lfvector( float (*to)[3], fmatrix3x3 *from, lfVector *fLongVector)
+{
+ unsigned int i = 0;
+
+ for(i = 0; i < from[0].vcount; i++)
+ {
+ mul_fmatrix_fvector(to[from[i].r], from[i].m, fLongVector[from[i].c]);
+ }
+}
+
/* SPARSE SYMMETRIC add big matrix with big matrix: A = B + C*/
DO_INLINE void add_bfmatrix_bfmatrix( fmatrix3x3 *to, fmatrix3x3 *from, fmatrix3x3 *matrix)
{
@@ -983,7 +998,7 @@
sub_lfvector_lfvector(r, lB, r, numverts);
filter(r, S);
- mul_bfmatrix_lfvector(p, Pinv, r);
+ mul_prevfmatrix_lfvector(p, Pinv, r);
filter(p, S);
deltaNew = dot_lfvector(r, p, numverts);
@@ -1005,7 +1020,7 @@
add_lfvector_lfvectorS(r, r, s, -alpha, numverts);
- mul_bfmatrix_lfvector(h, Pinv, r);
+ mul_prevfmatrix_lfvector(h, Pinv, r);
filter(h, S);
deltaOld = deltaNew;
@@ -1013,6 +1028,7 @@
deltaNew = dot_lfvector(r, h, numverts);
add_lfvector_lfvectorS(p, h, p, deltaNew / deltaOld, numverts);
+
filter(p, S);
}
@@ -1125,6 +1141,7 @@
}
+ /*
if(s->type == CLOTH_SPRING_TYPE_COLLISION)
{
if(length < L)
@@ -1135,6 +1152,7 @@
}
return;
}
+ */
// calculate force of structural + shear springs
if(s->type != CLOTH_SPRING_TYPE_BENDING)
@@ -1150,7 +1168,7 @@
VECADD(s->f, s->f, stretch_force);
// Ascher & Boxman, p.21: Damping only during elonglation
- mul_fvector_S(damping_force, extent, clmd->sim_parms->Cdis * ((INPR(vel,extent)/length)));
+ mul_fvector_S(damping_force, extent, clmd->sim_parms->Cdis * 0.01 * ((INPR(vel,extent)/length)));
VECADD(s->f, s->f, damping_force);
dfdx_spring_type1(s->dfdx, dir,length,L,k);
@@ -1171,12 +1189,17 @@
mul_fvector_S(bending_force, dir, fbstar(length, L, k, cb));
VECADD(s->f, s->f, bending_force);
- if(INPR(bending_force,bending_force) > 0.13*0.13)
+ // if(INPR(bending_force,bending_force) > 0.13*0.13)
{
clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_BIG_FORCE;
}
+
dfdx_spring_type2(s->dfdx, dir,length,L,k, cb);
+ /*
+ if(s->ij == 300 || s->kl == 300)
+ printf("id->F[0]: %f, id->F[1]: %f, id->F[2]: %f\n", s->f[0], s->f[1], s->f[2]);
+ */
}
}
}
@@ -1192,7 +1215,7 @@
{
sub_fmatrix_fmatrix(dFdV[s->ij].m, dFdV[s->ij].m, s->dfdv);
sub_fmatrix_fmatrix(dFdV[s->kl].m, dFdV[s->kl].m, s->dfdv);
- add_fmatrix_fmatrix(dFdV[s->matrix_index].m, dFdV[s->matrix_index].m, s->dfdv);
+ add_fmatrix_fmatrix(dFdV[s->matrix_index].m, dFdV[s->matrix_index].m, s->dfdv);
}
else if(!(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_BIG_FORCE))
return 0;
@@ -1306,7 +1329,7 @@
float speed[3] = {0.0f, 0.0f,0.0f};
float force[3]= {0.0f, 0.0f, 0.0f};
-#pragma omp parallel for private (i) shared(lF)
+// #pragma omp parallel for private (i) shared(lF)
for(i = 0; i < cloth->numverts; i++)
{
float vertexnormal[3]={0,0,0};
@@ -1363,7 +1386,6 @@
}
clmd->sim_parms->flags &= ~CLOTH_SIMSETTINGS_FLAG_BIG_FORCE;
-
}
void simulate_implicit_euler(lfVector *Vnew, lfVector *lX, lfVector *lV, lfVector *lF, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, float dt, fmatrix3x3 *A, lfVector *B, lfVector *dV, fmatrix3x3 *S, lfVector *z, fmatrix3x3 *P, fmatrix3x3 *Pinv)
@@ -1375,31 +1397,23 @@
zero_lfvector(dV, numverts);
subadd_bfmatrixS_bfmatrixS(A, dFdV, dt, dFdX, (dt*dt));
-
mul_bfmatrix_lfvector(dFdXmV, dFdX, lV);
-
add_lfvectorS_lfvectorS(B, lF, dt, dFdXmV, (dt*dt), numverts);
- // itstart();
-
+ // TODO: unstable with quality=5 + stiffness=7000 + no zero_lfvector()
cg_filtered(dV, A, B, z, S); /* conjugate gradient algorithm to solve Ax=b */
- // TODO: if anyone finds a way to correct this function =>
- // explodes with stiffness = 3000 and 16k verts + pinned at 2 corners
+ // TODO: unstable with quality=5 + stiffness=7000
// cg_filtered_pre(dV, A, B, z, S, P, Pinv);
- // itend();
- // printf("cg_filtered calc time: %f\n", (float)itval());
-
// advance velocities
add_lfvector_lfvector(Vnew, lV, dV, numverts);
-
del_lfvector(dFdXmV);
}
int implicit_solver (Object *ob, float frame, ClothModifierData *clmd, ListBase *effectors)
-{
+{
unsigned int i=0;
float step=0.0f, tf=1.0f;
Cloth *cloth = clmd->clothObject;
@@ -1418,7 +1432,10 @@
// update velocities with constrained velocities from pinned verts
if(verts [i].goal >= SOFTGOALSNAP)
{
- VECSUB(id->V[i], cloth->xconst[i], cloth->xold[i]);
+ float temp[3];
+ VECSUB(temp, cloth->xconst[i], cloth->xold[i]);
+ VECSUB(id->z[i], temp, id->V[i]);
+
// VecMulf(id->V[i], 1.0 / dt);
}
}
@@ -1612,6 +1629,8 @@
float v1[3], v2[3], relativeVelocity[3];
float magrelVel = 0.0;
float epsilon = clmd->coll_parms->epsilon;
+
+ return 0;
cloth1 = clmd->clothObject;
@@ -2143,7 +2162,7 @@
int collisions = 0, count = 0;
float (*current_x)[3];
Implicit_Data *id = NULL;
- /*
+
if (!(((Cloth *)clmd->clothObject)->tree))
{
printf("No BVH found\n");
@@ -2182,7 +2201,7 @@
// fill collision list
collisions += bvh_traverse ( bvh1->root, bvh2->root, &collision_list );
-
+
// call static collision response
if ( collision_list )
{
@@ -2223,7 +2242,7 @@
VECADD(cloth->current_x[i], cloth->current_xold[i], cloth->current_v[i]);
}
//////////////////////////////////////////////
- */
+
/*
// fill collision list
collisions += bvh_traverse(self_bvh->root, self_bvh->root, &collision_list);
Modified: branches/cloth/blender/source/blender/blenkernel/intern/key.c
===================================================================
--- branches/cloth/blender/source/blender/blenkernel/intern/key.c 2007-12-12 17:01:46 UTC (rev 12855)
+++ branches/cloth/blender/source/blender/blenkernel/intern/key.c 2007-12-12 17:33:59 UTC (rev 12856)
@@ -672,14 +672,12 @@
/* step 2: do it */
- kb= key->block.first;
- while(kb) {
-
+ for(kb=key->block.first; kb; kb=kb->next) {
if(kb!=key->refkey) {
float icuval= kb->curval;
/* only with value, and no difference allowed */
- if(icuval!=0.0f && kb->totelem==tot) {
+ if(!(kb->flag & KEYBLOCK_MUTE) && icuval!=0.0f && kb->totelem==tot) {
KeyBlock *refb;
float weight, *weights= kb->weights;
@@ -738,7 +736,6 @@
}
}
}
- kb= kb->next;
}
}
@@ -1312,6 +1309,9 @@
if(ob->shapeflag & (OB_SHAPE_LOCK|OB_SHAPE_TEMPLOCK)) {
KeyBlock *kb= BLI_findlink(&key->block, ob->shapenr-1);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list