diff options
author | Daniel Genrich <daniel.genrich@gmx.net> | 2008-08-08 18:24:47 +0400 |
---|---|---|
committer | Daniel Genrich <daniel.genrich@gmx.net> | 2008-08-08 18:24:47 +0400 |
commit | 6501ff6bddeb6b2b95086d5ac95bbd330806c860 (patch) | |
tree | ed789f9b0e95ec340340c5f23f2316eb51be6c1d | |
parent | 98302f6c7c9a80baabf359b48c5f0d531aa6b554 (diff) |
Fixing point-face distance to support degenerated tris/quads with area<FLT_EPSILON
-rw-r--r-- | source/blender/blenkernel/intern/bvhutils.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c index db1113b9e38..10e92b8b705 100644 --- a/source/blender/blenkernel/intern/bvhutils.c +++ b/source/blender/blenkernel/intern/bvhutils.c @@ -268,17 +268,24 @@ static void mesh_faces_nearest_point(void *userdata, int index, const float *co, do { float nearest_tmp[3], dist; - - dist = nearest_point_in_tri_surface(co,t0, t1, t2, nearest_tmp); - if(dist < nearest->dist) + float vec[3][3]; + + // only insert valid triangles / quads with area > 0 + VECSUB(vec[0], t2, t1); + VECSUB(vec[1], t0, t1); + Crossf(vec[2], vec[0], vec[1]); + if(INPR(vec[2], vec[2]) >= FLT_EPSILON) { - nearest->index = index; - nearest->dist = dist; - VECCOPY(nearest->co, nearest_tmp); - CalcNormFloat((float*)t0, (float*)t1, (float*)t2, nearest->no); //TODO.. (interpolate normals from the vertexs coordinates? + dist = nearest_point_in_tri_surface(co,t0, t1, t2, nearest_tmp); + if(dist < nearest->dist) + { + nearest->index = index; + nearest->dist = dist; + VECCOPY(nearest->co, nearest_tmp); + CalcNormFloat((float*)t0, (float*)t1, (float*)t2, nearest->no); //TODO.. (interpolate normals from the vertexs coordinates? + } } - t1 = t2; t2 = t3; t3 = NULL; @@ -396,7 +403,7 @@ void bvhtree_from_mesh_faces(BVHTreeFromMesh *data, DerivedMesh *mesh, float eps VECCOPY(co[2], vert[ face[i].v3 ].co); if(face[i].v4) VECCOPY(co[3], vert[ face[i].v4 ].co); - + BLI_bvhtree_insert(tree, i, co[0], face[i].v4 ? 4 : 3); } BLI_bvhtree_balance(tree); |