Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Genrich <daniel.genrich@gmx.net>2008-08-08 18:24:47 +0400
committerDaniel Genrich <daniel.genrich@gmx.net>2008-08-08 18:24:47 +0400
commit6501ff6bddeb6b2b95086d5ac95bbd330806c860 (patch)
treeed789f9b0e95ec340340c5f23f2316eb51be6c1d /source/blender
parent98302f6c7c9a80baabf359b48c5f0d531aa6b554 (diff)
Fixing point-face distance to support degenerated tris/quads with area<FLT_EPSILON
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/intern/bvhutils.c25
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);