From: havoc Date: Sun, 25 Jan 2009 17:57:37 +0000 (+0000) Subject: fix stupid degenerate triangle check, I don't have a clue what I was X-Git-Tag: xonotic-v0.1.0preview~1923 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=96ec5538718dce6817757d85f613418ca055e3a7;p=xonotic%2Fdarkplaces.git fix stupid degenerate triangle check, I don't have a clue what I was thinking when I wrote it git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8671 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/model_shared.c b/model_shared.c index 911d3fca..381eb71f 100644 --- a/model_shared.c +++ b/model_shared.c @@ -2105,23 +2105,20 @@ void Mod_SnapVertices(int numcomponents, int numvertices, float *vertices, float int Mod_RemoveDegenerateTriangles(int numtriangles, const int *inelement3i, int *outelement3i, const float *vertex3f) { int i, outtriangles; - float d, edgedir[3], temp[3]; + float d, edgedir1[3], edgedir2[3], temp[3]; // a degenerate triangle is one with no width (thickness, surface area) // these are characterized by having all 3 points colinear (along a line) // or having two points identical + // the simplest check is to calculate the triangle's area for (i = 0, outtriangles = 0;i < numtriangles;i++, inelement3i += 3) { // calculate first edge - VectorSubtract(vertex3f + inelement3i[1] * 3, vertex3f + inelement3i[0] * 3, edgedir); - if (VectorLength2(edgedir) < 0.0001f) - continue; // degenerate first edge (no length) - VectorNormalize(edgedir); - // check if third point is on the edge (colinear) - d = -DotProduct(vertex3f + inelement3i[2] * 3, edgedir); - VectorMA(vertex3f + inelement3i[2] * 3, d, edgedir, temp); - if (VectorLength2(temp) < 0.0001f) - continue; // third point colinear with first edge - // valid triangle (no colinear points, no duplicate points) + VectorSubtract(vertex3f + inelement3i[1] * 3, vertex3f + inelement3i[0] * 3, edgedir1); + VectorSubtract(vertex3f + inelement3i[1] * 3, vertex3f + inelement3i[0] * 3, edgedir2); + CrossProduct(edgedir1, edgedir2, temp); + if (VectorLength2(temp) < 0.001f) + continue; // degenerate triangle (no area) + // valid triangle (has area) VectorCopy(inelement3i, outelement3i); outelement3i += 3; outtriangles++;