X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=polygon.c;h=2bc897fbe8baec206093b5fe6bb26308b1a15793;hb=ac8abfb4850b0061611141880dbff840a2e705bc;hp=8133dce3dbd0e99d26dbf705a0b63498c723b12c;hpb=2824a71dcb6cb3568f87b9a3dae340c342865669;p=xonotic%2Fdarkplaces.git diff --git a/polygon.c b/polygon.c index 8133dce3..2bc897fb 100644 --- a/polygon.c +++ b/polygon.c @@ -9,7 +9,7 @@ Polygon clipping routines written by Forest Hale and placed into public domain. void PolygonF_QuadForPlane(float *outpoints, float planenormalx, float planenormaly, float planenormalz, float planedist, float quadsize) { float d, quadright[3], quadup[3]; - if (planenormalz > planenormalx && planenormalz > planenormaly) + if (fabs(planenormalz) > fabs(planenormalx) && fabs(planenormalz) > fabs(planenormaly)) { quadup[0] = 1; quadup[1] = 0; @@ -25,10 +25,10 @@ void PolygonF_QuadForPlane(float *outpoints, float planenormalx, float planenorm d = -(quadup[0] * planenormalx + quadup[1] * planenormaly + quadup[2] * planenormalz); // VectorMA(quadup, d, planenormal, quadup); quadup[0] += d * planenormalx; - quadup[1] += d * planenormalx; - quadup[2] += d * planenormalx; + quadup[1] += d * planenormaly; + quadup[2] += d * planenormalz; // VectorNormalize(quadup); - d = 1.0 / sqrt(quadup[0] * quadup[0] + quadup[1] * quadup[1] + quadup[2] * quadup[2]); + d = (float)(1.0 / sqrt(quadup[0] * quadup[0] + quadup[1] * quadup[1] + quadup[2] * quadup[2])); quadup[0] *= d; quadup[1] *= d; quadup[2] *= d; @@ -54,7 +54,7 @@ void PolygonF_QuadForPlane(float *outpoints, float planenormalx, float planenorm void PolygonD_QuadForPlane(double *outpoints, double planenormalx, double planenormaly, double planenormalz, double planedist, double quadsize) { double d, quadright[3], quadup[3]; - if (planenormalz > planenormalx && planenormalz > planenormaly) + if (fabs(planenormalz) > fabs(planenormalx) && fabs(planenormalz) > fabs(planenormaly)) { quadup[0] = 1; quadup[1] = 0; @@ -70,8 +70,8 @@ void PolygonD_QuadForPlane(double *outpoints, double planenormalx, double planen d = -(quadup[0] * planenormalx + quadup[1] * planenormaly + quadup[2] * planenormalz); // VectorMA(quadup, d, planenormal, quadup); quadup[0] += d * planenormalx; - quadup[1] += d * planenormalx; - quadup[2] += d * planenormalx; + quadup[1] += d * planenormaly; + quadup[2] += d * planenormalz; // VectorNormalize(quadup); d = 1.0 / sqrt(quadup[0] * quadup[0] + quadup[1] * quadup[1] + quadup[2] * quadup[2]); quadup[0] *= d; @@ -96,21 +96,21 @@ void PolygonD_QuadForPlane(double *outpoints, double planenormalx, double planen outpoints[11] = planedist * planenormalz - quadsize * quadright[2] - quadsize * quadup[2]; } -void PolygonF_Divide(unsigned int innumpoints, const float *inpoints, float planenormalx, float planenormaly, float planenormalz, float planedist, float epsilon, unsigned int outfrontmaxpoints, float *outfrontpoints, unsigned int *neededfrontpoints, unsigned int outbackmaxpoints, float *outbackpoints, unsigned int *neededbackpoints) +void PolygonF_Divide(int innumpoints, const float *inpoints, float planenormalx, float planenormaly, float planenormalz, float planedist, float epsilon, int outfrontmaxpoints, float *outfrontpoints, int *neededfrontpoints, int outbackmaxpoints, float *outbackpoints, int *neededbackpoints, int *oncountpointer) { - unsigned int i, frontcount, backcount; + int i, frontcount = 0, backcount = 0, oncount = 0; const float *n, *p; - float frac, pdist, ndist; - frontcount = 0; - backcount = 0; - p = inpoints + (innumpoints - 1) * 3; - n = inpoints; - pdist = p[0] * planenormalx + p[1] * planenormaly + p[2] * planenormalz - planedist; + double frac, pdist, ndist; for (i = 0;i < innumpoints;i++) { + p = inpoints + i * 3; + n = inpoints + ((i + 1) < innumpoints ? (i + 1) : 0) * 3; + pdist = p[0] * planenormalx + p[1] * planenormaly + p[2] * planenormalz - planedist; ndist = n[0] * planenormalx + n[1] * planenormaly + n[2] * planenormalz - planedist; if (pdist >= -epsilon) { + if (pdist <= epsilon) + oncount++; if (frontcount < outfrontmaxpoints) { *outfrontpoints++ = p[0]; @@ -131,47 +131,47 @@ void PolygonF_Divide(unsigned int innumpoints, const float *inpoints, float plan } if ((pdist > epsilon && ndist < -epsilon) || (pdist < -epsilon && ndist > epsilon)) { + oncount++; frac = pdist / (pdist - ndist); if (frontcount < outfrontmaxpoints) { - *outfrontpoints++ = p[0] + frac * (n[0] - p[0]); - *outfrontpoints++ = p[1] + frac * (n[1] - p[1]); - *outfrontpoints++ = p[2] + frac * (n[2] - p[2]); + *outfrontpoints++ = (float)(p[0] + frac * (n[0] - p[0])); + *outfrontpoints++ = (float)(p[1] + frac * (n[1] - p[1])); + *outfrontpoints++ = (float)(p[2] + frac * (n[2] - p[2])); } frontcount++; if (backcount < outbackmaxpoints) { - *outbackpoints++ = p[0] + frac * (n[0] - p[0]); - *outbackpoints++ = p[1] + frac * (n[1] - p[1]); - *outbackpoints++ = p[2] + frac * (n[2] - p[2]); + *outbackpoints++ = (float)(p[0] + frac * (n[0] - p[0])); + *outbackpoints++ = (float)(p[1] + frac * (n[1] - p[1])); + *outbackpoints++ = (float)(p[2] + frac * (n[2] - p[2])); } backcount++; } - p = n; - n += 3; - pdist = ndist; } if (neededfrontpoints) *neededfrontpoints = frontcount; if (neededbackpoints) *neededbackpoints = backcount; + if (oncountpointer) + *oncountpointer = oncount; } -void PolygonD_Divide(unsigned int innumpoints, const double *inpoints, double planenormalx, double planenormaly, double planenormalz, double planedist, double epsilon, unsigned int outfrontmaxpoints, double *outfrontpoints, unsigned int *neededfrontpoints, unsigned int outbackmaxpoints, double *outbackpoints, unsigned int *neededbackpoints) +void PolygonD_Divide(int innumpoints, const double *inpoints, double planenormalx, double planenormaly, double planenormalz, double planedist, double epsilon, int outfrontmaxpoints, double *outfrontpoints, int *neededfrontpoints, int outbackmaxpoints, double *outbackpoints, int *neededbackpoints, int *oncountpointer) { - unsigned int i, frontcount, backcount; + int i, frontcount = 0, backcount = 0, oncount = 0; const double *n, *p; double frac, pdist, ndist; - frontcount = 0; - backcount = 0; - p = inpoints + (innumpoints - 1) * 3; - n = inpoints; - pdist = p[0] * planenormalx + p[1] * planenormaly + p[2] * planenormalz - planedist; for (i = 0;i < innumpoints;i++) { + p = inpoints + i * 3; + n = inpoints + ((i + 1) < innumpoints ? (i + 1) : 0) * 3; + pdist = p[0] * planenormalx + p[1] * planenormaly + p[2] * planenormalz - planedist; ndist = n[0] * planenormalx + n[1] * planenormaly + n[2] * planenormalz - planedist; if (pdist >= -epsilon) { + if (pdist <= epsilon) + oncount++; if (frontcount < outfrontmaxpoints) { *outfrontpoints++ = p[0]; @@ -192,6 +192,7 @@ void PolygonD_Divide(unsigned int innumpoints, const double *inpoints, double pl } if ((pdist > epsilon && ndist < -epsilon) || (pdist < -epsilon && ndist > epsilon)) { + oncount++; frac = pdist / (pdist - ndist); if (frontcount < outfrontmaxpoints) { @@ -208,13 +209,12 @@ void PolygonD_Divide(unsigned int innumpoints, const double *inpoints, double pl } backcount++; } - p = n; - n += 3; - pdist = ndist; } if (neededfrontpoints) *neededfrontpoints = frontcount; if (neededbackpoints) *neededbackpoints = backcount; + if (oncountpointer) + *oncountpointer = oncount; }