[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29004] branches/render25/source/blender/ blenkernel/intern/collision.c: Render Branch: for hair collisions, always treat quads as split into
Brecht Van Lommel
brecht at blender.org
Wed May 26 17:59:45 CEST 2010
Revision: 29004
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29004
Author: blendix
Date: 2010-05-26 17:59:45 +0200 (Wed, 26 May 2010)
Log Message:
-----------
Render Branch: for hair collisions, always treat quads as split into
triangles for intersections, solves some issues.
Modified Paths:
--------------
branches/render25/source/blender/blenkernel/intern/collision.c
Modified: branches/render25/source/blender/blenkernel/intern/collision.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/collision.c 2010-05-26 11:25:33 UTC (rev 29003)
+++ branches/render25/source/blender/blenkernel/intern/collision.c 2010-05-26 15:59:45 UTC (rev 29004)
@@ -1447,15 +1447,17 @@
Cloth *cloth = clmd->clothObject;
ClothVertex *cv;
float (*dis)[2] = MEM_callocN(sizeof(float)*2*cloth->numverts, "coll point distancers");
- float lambda, dot, lambda2, uv[2], uv2[2], epsilon;
+ float lambda, lambda2, uv[2], uv2[2], epsilon;
MFace **frefs = MEM_callocN(sizeof(void*)*clmd->clothObject->numverts, "coll indices");
+ int *fsides = MEM_callocN(sizeof(int)*clmd->clothObject->numverts, "coll sides");
int i, j, ret = 0;
epsilon = MAX2(clmd->coll_parms->epsilon, collmd->bvhtree ? BLI_bvhtree_getepsilon(collmd->bvhtree) : 0);
for (i=0; i<result; i++, overlap++) {
MFace *mf = collmd->mfaces + overlap->indexB;
- float v1[3], v2[3], v3[3], v4[3], no[3], vec[3], ov1[3], ov2[3], ov3[3];
+ float v1[3], v2[3], v3[3], no[3], vec[3], ov1[3], ov2[3], ov3[3];
+ int side;
if (overlap->indexA < 0 || overlap->indexA >= cloth->numverts)
continue;
@@ -1465,51 +1467,59 @@
j = overlap->indexA;
cv = cloth->verts + overlap->indexA;
- VECCOPY(v1, collmd->current_xnew[mf->v1].co);
- VECCOPY(v2, collmd->current_xnew[mf->v2].co);
- VECCOPY(v3, collmd->current_xnew[mf->v3].co);
- if (mf->v4) {
- VECCOPY(v4, collmd->current_xnew[mf->v4].co);
- normal_quad_v3(no, v1, v2, v3, v4);
- } else {
+ for(side=0; side < (mf->v4? 2: 1); side++) {
+ if(side == 0) {
+ copy_v3_v3(v1, collmd->current_xnew[mf->v1].co);
+ copy_v3_v3(v2, collmd->current_xnew[mf->v2].co);
+ copy_v3_v3(v3, collmd->current_xnew[mf->v3].co);
+ }
+ else {
+ copy_v3_v3(v1, collmd->current_xnew[mf->v1].co);
+ copy_v3_v3(v2, collmd->current_xnew[mf->v3].co);
+ copy_v3_v3(v3, collmd->current_xnew[mf->v4].co);
+ }
+
normal_tri_v3(no, v1, v2, v3);
- }
+ mul_v3_fl(no, epsilon);
+ add_v3_v3(v1, no);
+ add_v3_v3(v2, no);
+ add_v3_v3(v3, no);
- mul_v3_fl(no, epsilon);
- add_v3_v3(v1, no);
- add_v3_v3(v2, no);
- add_v3_v3(v3, no);
- if (mf->v4)
- add_v3_v3(v4, no);
+ normalize_v3(no);
- normalize_v3(no);
+ if(isect_ray_tri_plane_v3(cv->tx, no, v1, v2, v3, &lambda, uv)) {
+ /*we need to compute distance to the plane of the previous time step's face, not the current one*/
+ if(side == 0) {
+ copy_v3_v3(ov1, collmd->current_x[mf->v1].co);
+ copy_v3_v3(ov2, collmd->current_x[mf->v2].co);
+ copy_v3_v3(ov3, collmd->current_x[mf->v3].co);
+ }
+ else {
+ copy_v3_v3(ov1, collmd->current_x[mf->v1].co);
+ copy_v3_v3(ov2, collmd->current_x[mf->v3].co);
+ copy_v3_v3(ov3, collmd->current_x[mf->v4].co);
+ }
- if (isect_ray_tri_plane_v3(cv->tx, no, v1, v2, v3, &lambda, uv) ||
- (mf->v4 && isect_ray_tri_plane_v3(cv->tx, no, v1, v3, v4, &lambda, uv)))
- {
- /*we need to compute distance to the plane of the previous time step's face, not the current one*/
- VECCOPY(ov1, collmd->current_x[mf->v1].co);
- VECCOPY(ov2, collmd->current_x[mf->v2].co);
- VECCOPY(ov3, collmd->current_x[mf->v3].co);
+ normal_tri_v3(no, ov1, ov2, ov3);
- normal_tri_v3(no, ov1, ov2, ov3);
+ sub_v3_v3v3(vec, cv->txold, ov1);
+ normalize_v3(vec);
+ if (dot_v3v3(vec, no) < FLT_EPSILON) {
+ continue;
+ }
- sub_v3_v3v3(vec, cv->txold, ov1);
- normalize_v3(vec);
- if (dot_v3v3(vec, no) < FLT_EPSILON) {
- continue;
- }
+ mul_v3_fl(no, -1.0);
+ isect_ray_tri_plane_v3(cv->txold, no, ov1, ov2, ov3, &lambda2, uv);
- mul_v3_fl(no, -1.0);
- isect_ray_tri_plane_v3(cv->txold, no, ov1, ov2, ov3, &lambda2, uv);
+ if (lambda2 < 0.0)
+ continue;
- if (lambda2 < 0.0)
- continue;
-
- if (!frefs[j] || fabs(lambda2) < dis[j][0]) {
- frefs[j] = mf;
- dis[j][0] = fabs(lambda2);
- dis[j][1] = fabs(lambda);
+ if (!frefs[j] || fabs(lambda2) < dis[j][0]) {
+ frefs[j] = mf;
+ fsides[j] = side;
+ dis[j][0] = fabs(lambda2);
+ dis[j][1] = fabs(lambda);
+ }
}
}
}
@@ -1517,48 +1527,49 @@
cv = cloth->verts;
for (i=0; i<cloth->numverts; i++, cv++) {
MFace *mf;
- float v1[3], v2[3], v3[3], v4[3], no[3], vec[3];
+ float v1[3], v2[3], v3[3], no[3], vec[3];
+ int side;
if (!frefs[i])
continue;
lambda = dis[i][1];
mf = frefs[i];
+ side = fsides[i];
ret += 1;
- VECCOPY(v1, collmd->current_xnew[mf->v1].co);
- VECCOPY(v2, collmd->current_xnew[mf->v2].co);
- VECCOPY(v3, collmd->current_xnew[mf->v3].co);
- if (mf->v4) {
- VECCOPY(v4, collmd->current_xnew[mf->v4].co);
- normal_quad_v3(no, v1, v2, v3, v4);
- } else {
- normal_tri_v3(no, v1, v2, v3);
+ if(side == 0) {
+ copy_v3_v3(v1, collmd->current_xnew[mf->v1].co);
+ copy_v3_v3(v2, collmd->current_xnew[mf->v2].co);
+ copy_v3_v3(v3, collmd->current_xnew[mf->v3].co);
}
+ else {
+ copy_v3_v3(v1, collmd->current_xnew[mf->v1].co);
+ copy_v3_v3(v2, collmd->current_xnew[mf->v3].co);
+ copy_v3_v3(v3, collmd->current_xnew[mf->v4].co);
+ }
+ normal_tri_v3(no, v1, v2, v3);
mul_v3_fl(no, epsilon);
add_v3_v3(v1, no);
add_v3_v3(v2, no);
add_v3_v3(v3, no);
- if (mf->v4)
- add_v3_v3(v4, no);
normalize_v3(no);
- VECCOPY(vec, cv->tv);
+ copy_v3_v3(vec, cv->tv);
mul_v3_fl(vec, -1.0f);
normalize_v3(vec);
- dot = dot_v3v3(no, vec);
/*handle friction. probably really stupid math here, no time for doing better though*/
- if (isect_ray_tri_v3(cv->tx, vec, v1, v2, v3, &lambda2, uv2) ||
- (mf->v4 && isect_ray_tri_v3(cv->tx, vec, v1, v3, v4, &lambda2, uv2)))
+ if((clmd->coll_parms->friction > 0.0f) &&
+ isect_ray_tri_v3(cv->tx, vec, v1, v2, v3, &lambda2, uv2))
{
float frictionfac = clmd->coll_parms->friction*0.01, oldno[3];
/*absurdly simplistic linear interpolation formula, heh*/
- VECCOPY(oldno, no);
+ copy_v3_v3(oldno, no);
sub_v3_v3(vec, no);
mul_v3_fl(vec, frictionfac);
add_v3_v3(no, vec);
@@ -1567,16 +1578,19 @@
normalize_v3(no);
reflect_v3_v3v3(vec, no, oldno);
normalize_v3(vec);
- } else VECCOPY(vec, no);
+ }
+ /*else
+ copy_v3_v3(vec, no);*/
+ //mul_v3_fl(vec, lambda);
+ //add_v3_v3(cv->txold, vec);
+
mul_v3_fl(no, lambda);
- mul_v3_fl(vec, lambda);
-
- //add_v3_v3(cv->txold, vec);
add_v3_v3(cv->tv, no);
}
MEM_freeN(frefs);
+ MEM_freeN(fsides);
MEM_freeN(dis);
return ret;
More information about the Bf-blender-cvs
mailing list