Revision: 29412 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29412 Author: joeedh Date: 2010-06-11 19:26:53 +0200 (Fri, 11 Jun 2010)
Log Message: ----------- commit of working copy, so I can compile this on another computer that's fast enough for real testing. Modified Paths: -------------- branches/hairsim/release/scripts/ui/properties_physics_common.py branches/hairsim/source/blender/blenkernel/intern/cloth.c branches/hairsim/source/blender/blenkernel/intern/collision.c branches/hairsim/source/blender/blenkernel/intern/derivatives.cpp branches/hairsim/source/blender/blenkernel/intern/implicit.c branches/hairsim/source/blender/blenkernel/intern/particle.c branches/hairsim/source/blender/blenlib/intern/BLI_ghash.c branches/hairsim/source/blender/blenlib/intern/math_geom.c branches/hairsim/source/blender/blenlib/intern/math_vector_inline.c branches/hairsim/source/blender/editors/interface/interface_handlers.c Modified: branches/hairsim/release/scripts/ui/properties_physics_common.py =================================================================== --- branches/hairsim/release/scripts/ui/properties_physics_common.py 2010-06-11 17:17:02 UTC (rev 29411) +++ branches/hairsim/release/scripts/ui/properties_physics_common.py 2010-06-11 17:26:53 UTC (rev 29412) @@ -72,7 +72,7 @@ sub.prop(cache, "quick_cache") sub = col.column() - sub.enabled = bpy.data.file_is_saved + #sub.enabled = bpy.data.file_is_saved sub.prop(cache, "disk_cache") col.label(text=cache.info) Modified: branches/hairsim/source/blender/blenkernel/intern/cloth.c =================================================================== --- branches/hairsim/source/blender/blenkernel/intern/cloth.c 2010-06-11 17:17:02 UTC (rev 29411) +++ branches/hairsim/source/blender/blenkernel/intern/cloth.c 2010-06-11 17:26:53 UTC (rev 29412) @@ -319,9 +319,9 @@ ClothVertex *v1 = cloth->verts + spring->ij, *v2 = cloth->verts + spring->kl; float co2[4][3]; - VECCOPY(co2[0], v1->txold); + VECCOPY(co2[0], v1->txold2); VECCOPY(co2[1], v1->tx); - VECCOPY(co2[2], v2->txold); + VECCOPY(co2[2], v2->txold2); VECCOPY(co2[3], v2->tx); ret = BLI_bvhtree_update_node(cloth->bvhspringtree, i, (float*)co2, NULL, 4); Modified: branches/hairsim/source/blender/blenkernel/intern/collision.c =================================================================== --- branches/hairsim/source/blender/blenkernel/intern/collision.c 2010-06-11 17:17:02 UTC (rev 29411) +++ branches/hairsim/source/blender/blenkernel/intern/collision.c 2010-06-11 17:26:53 UTC (rev 29412) @@ -76,16 +76,16 @@ g = guesstab[(int)ceil(g2)];\ } else g = g*0.5; -#define FAST_SQRT(n, g, t) (t=(n/g + g)*0.5, t=(n/t + t)*0.5, t=(n/t + t)*0.5, t=(n/t + t)*0.5, t) -/*#define normalize_fast_d(v) {\ +/*#define FAST_SQRT(n, g, t) (t=(n/g + g)*0.5, t=(n/t + t)*0.5, t=(n/t + t)*0.5, t=(n/t + t)*0.5, t) +#define normalize_fast_d(v) {\ double _d = v[0]*v[0] + v[1]*v[1] + v[2]*v[2], _g, _t; \ GUESS(_d, _g);\ _d = FAST_SQRT(_d, _g, _t); \ _d = 1.0/_d; \ v[0]*=_d; v[1]*=_d; v[2]*=_d;\ } +*/ -#undef normalize_fast_d*/ #define normalize_fast_d normalize_v3_d #define GUESSTAB_LEN 8000 @@ -101,6 +101,7 @@ } //#define saacos_d acos_fast +//#define acos acos_fast static void init_guess_tab(void) { int i; @@ -177,6 +178,8 @@ cdouble_t vec[3], dis; VECSUB(vec, v1->tx, v2->tx); + +// return; dis = len_v3_d(vec); @@ -234,14 +237,17 @@ cdouble_t sign, elen1, elen2; } EdgeConstraint; +void solve_bending_gradient(double ip1[3], double ip2[3], double ip3[3], double grad1[3], + double grad2[3], double grad3[3], double restangle); + double solve_tetra_gradient(double ip1[3], double ip2[3], double ip3[3], double ip4[3], double grad1[3], double grad2[3], double grad3[3], - double grad4[3], double elen1, double elen2); + double grad4[3], double upno[3], double elen1, double elen2); static void eval_edge_constraint(void *vself) { EdgeConstraint *self = vself; ClothVertex *v1=self->v1, *v2=self->v2, *v3=self->v3, *v4=self->v4; - cdouble_t g1[3], g2[3], g3[3], g4[3], offv1[3], offv2[3], l1[3], l2[3]; + cdouble_t g1[3], g2[3], g3[3], g4[3], n[3], vec1[3], vec2[3], offv1[3], offv2[3], l1[3], l2[3], t[4][3]; copy_v3_v3_d(l1, v1->tx); copy_v3_v3_d(l2, v2->tx); @@ -252,16 +258,45 @@ add_v3_v3v3_d(offv2, v4->tx, self->off); scale_line_v3_d(offv1, offv2, EDGE_SCALE); + + sub_v3_v3v3_d(vec1, l1, l2); + sub_v3_v3v3_d(vec2, offv1, offv2); + cross_v3_v3v3_d(n, vec1, vec2); + normalize_v3_d(n); + + add_v3_v3_d(n, l1); - self->coll.head.result = solve_tetra_gradient(l1, l2, offv1, offv2, g1, g2, g3, g4, self->elen1, self->elen2); + sub_v3_v3v3_d(vec1, n, l2); + sub_v3_v3v3_d(vec2, offv1, l2); + normalize_v3_d(vec1); + normalize_v3_d(vec2); + + self->coll.head.result = solve_tetra_gradient(l1, l2, offv1, offv2, g1, g2, g3, g4, self->coll.no, self->elen1, self->elen2); + + if (self->coll.head.result < -0.2) { + self->coll.head.result = 0.0; + return; + } + copy_v3_v3_d(t[0], v1->tx); + copy_v3_v3_d(t[1], v2->tx); + copy_v3_v3_d(t[2], offv1); + copy_v3_v3_d(t[3], offv2); + if (isnan(g1[0]) || isnan(g2[0]) || isnan(g3[0]) || isnan(g4[0])) self->coll.head.result = 0.0; - + copy_v3_v3_d(self->coll.head.grad[0], g1); copy_v3_v3_d(self->coll.head.grad[1], g2); copy_v3_v3_d(self->coll.head.grad[2], g3); copy_v3_v3_d(self->coll.head.grad[3], g4); + +#if 0 + mul_v3_d(self->coll.head.grad[0], 0.1); + mul_v3_d(self->coll.head.grad[1], 0.1); + mul_v3_d(self->coll.head.grad[2], 0.1); + mul_v3_d(self->coll.head.grad[3], 0.1); +#endif } static EdgeConstraint *make_edge_constraint(ClothVertex *v1, ClothVertex *v2, ClothVertex *v3, @@ -281,7 +316,7 @@ con->elen1 = len_v3v3_d(v1->tx, v2->tx); con->elen2 = len_v3v3_d(v3->tx, v4->tx); - mindis *= 1.01; + //mindis *= 1.00001; copy_v3_v3_d(con->off, no); copy_v3_v3_d(con->coll.no, no); @@ -302,9 +337,6 @@ return con; } - -void solve_bending_gradient(double ip1[3], double ip2[3], double ip3[3], double grad1[3], - double grad2[3], double grad3[3], double restangle); void derivatives_set_memarena(MemArena *arena); static void eval_point_constraint(void *vcon) { @@ -359,7 +391,7 @@ return; //} - con->coll.head.result = 0.0; + //con->coll.head.result = 0.0; } static PointConstraint *make_point_constraint(ClothVertex *point, ClothTri *colltri, @@ -379,24 +411,24 @@ con->v3 = colltri->verts[2]; con->colltri = colltri; - VECCOPY(ov1, v1->txold); - VECCOPY(ov2, v2->txold); - VECCOPY(ov3, v3->txold); + VECCOPY(ov1, v1->txold2); + VECCOPY(ov2, v2->txold2); + VECCOPY(ov3, v3->txold2); normal_tri_v3_d(con->coll.no, ov1, ov2, ov3); VECCOPY(no, con->coll.no); con->coll.head.type = CON_POINT; con->coll.head.k = 1.0; - con->coll.mindis = mindis+0.002; + con->coll.mindis = mindis*1.001; con->coll.friction = friction; con->coll.head.eval = eval_point_constraint; VECCOPY(co, point->tx); - VECCOPY(oco, point->txold); + VECCOPY(oco, point->txold2); - VECSUB(off, oco, v1->txold); + VECSUB(off, oco, v1->txold2); normalize_fast_d(off); if (dot_v3v3_d(off, no) < -DBL_EPSILON) { //con->flip = 1; @@ -508,7 +540,7 @@ mul_v3_d(g1, -1.0); copy_v3_v3_d(self->head.grad[0], g1); - self->head.result = -saacos(dot); //dot < 0.0 ? -saacos_d(dot) : saacos_d(dot); + self->head.result = -saacos_d(dot); //dot < 0.0 ? -saacos_d(dot) : saacos_d(dot); return; } @@ -577,10 +609,6 @@ return; } - //mul_v3_d(g1, 1.0/3.0); - //mul_v3_d(g2, 1.0/3.0); - //mul_v3_d(g3, 1.0/3.0); - copy_v3_v3_d(self->head.grad[0], g1); copy_v3_v3_d(self->head.grad[1], g2); copy_v3_v3_d(self->head.grad[2], g3); @@ -666,8 +694,8 @@ add_v3_v3_d(ct->cent, v3->tx); mul_v3_d(ct->cent, 1.0/3.0); - add_v3_v3v3_d(ct->ocent, v1->txold, v2->txold); - add_v3_v3_d(ct->ocent, v3->txold); + add_v3_v3v3_d(ct->ocent, v1->txold2, v2->txold2); + add_v3_v3_d(ct->ocent, v3->txold2); mul_v3_d(ct->ocent, 1.0/3.0); ct->dis = FLT_MAX; @@ -681,6 +709,9 @@ static void ensure_tri_edges(Cloth *cloth, ClothTri *tri) { ClothEdge *e1; ClothVertex *v1 = tri->verts[0], *v2 = tri->verts[1], *v3 = tri->verts[2]; + + if (tri->edges[0] && tri->edges[1] && tri->edges[2]) + return; e1 = get_cloth_edge(cloth, v1, v2); tri->edges[0] = e1; @@ -740,7 +771,7 @@ cv->mass = 1000000.0; /*supposed to represent infinite mass*/ VECADD2(tri->cent, cv->tx); - VECADD2(tri->ocent, cv->txold); + VECADD2(tri->ocent, cv->txold2); } normal_tri_v3_d(tri->no, tri->verts[0]->tx, tri->verts[1]->tx, tri->verts[2]->tx); @@ -757,7 +788,7 @@ void collision_move_object (CollisionModifierData *collmd, cdouble_t step, cdouble_t prevstep, cdouble_t epsilon, cdouble_t dt) { float tv[3] = {0, 0, 0}; - unsigned int i = 0; + int i = 0; if (prevstep < 0.0) { for ( i = 0; i < collmd->numverts; i++ ) @@ -853,9 +884,9 @@ if (!ret) return; - - BLI_bvhtree_update_tree ( tree ); } + + BLI_bvhtree_update_tree ( tree ); } /*********************************** @@ -960,22 +991,22 @@ return 0; } -static void check_and_handle_tri_coll(ClothModifierData *clmd, CollisionModifierData *collmd, +static int check_and_handle_tri_coll(ClothModifierData *clmd, CollisionModifierData *collmd, int v11, int v12, int v13, int v21, int v22, int v23, cdouble_t mindis, cdouble_t epsilon, int selfcol) { Cloth *cloth = clmd->clothObject; cdouble_t cv1[3], cv2[3], cv3[3], cent[3], ocent[3]; cdouble_t tv1[3][3], tv2[3][3], tov1[3][3], tov2[3][3]; PointConstraint *newp; - int i, ret; + int i, ret, numcol=0; VECCOPY(tv1[0], cloth->verts[v11].tx); VECCOPY(tv1[1], cloth->verts[v12].tx); VECCOPY(tv1[2], cloth->verts[v13].tx); - VECCOPY(tov1[0], cloth->verts[v11].txold); - VECCOPY(tov1[1], cloth->verts[v12].txold); - VECCOPY(tov1[2], cloth->verts[v13].txold); + VECCOPY(tov1[0], cloth->verts[v11].txold2); + VECCOPY(tov1[1], cloth->verts[v12].txold2); + VECCOPY(tov1[2], cloth->verts[v13].txold2); if (collmd) { VECCOPY(tv2[0], collmd->current_xnew[v21].co); @@ -990,9 +1021,9 @@ VECCOPY(tv2[1], cloth->verts[v22].tx); VECCOPY(tv2[2], cloth->verts[v23].tx); - VECCOPY(tov2[0], cloth->verts[v21].txold); - VECCOPY(tov2[1], cloth->verts[v22].txold); - VECCOPY(tov2[2], cloth->verts[v23].txold); + VECCOPY(tov2[0], cloth->verts[v21].txold2); + VECCOPY(tov2[1], cloth->verts[v22].txold2); + VECCOPY(tov2[2], cloth->verts[v23].txold2); } VECADD(cent, tv2[0], tv2[1]); @@ -1045,38 +1076,44 @@ } normalize_fast_d(vec); - VECCOPY(cv1, colltri->verts[0]->txold); - VECCOPY(cv2, colltri->verts[1]->txold); - VECCOPY(cv3, colltri->verts[2]->txold); + VECCOPY(cv1, colltri->verts[0]->txold2); + VECCOPY(cv2, colltri->verts[1]->txold2); + VECCOPY(cv3, colltri->verts[2]->txold2); for (i=0; i<3; i++) { newp = make_point_constraint(tri->verts[i], colltri, MAX2(tri->mindis, colltri->mindis), clmd->clothObject->arena, clmd->coll_parms->friction*0.01); BLI_addhead(&clmd->clothObject->constraints, newp); if (selfcol) newp->coll.head.k = 0.8; + numcol += 1; } } + + return numcol; } -void cloth_collision ( ModifierData *md1, ModifierData *md2, BVHTreeOverlap *overlap) +int cloth_collision ( ModifierData *md1, ModifierData *md2, BVHTreeOverlap *overlap) { @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs