X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=polygon.c;h=a02c032c1370da4fd85ed960d47e74a624069789;hb=70c042d9738e08160348dd674a27eb3274f364c2;hp=1a4f0797aa44639da88f4524c09b0e5bfae4e5df;hpb=b95096b3d0410a89dd1d4c96bbd56c90b71c69f2;p=xonotic%2Fdarkplaces.git diff --git a/polygon.c b/polygon.c index 1a4f0797..a02c032c 100644 --- a/polygon.c +++ b/polygon.c @@ -3,6 +3,8 @@ Polygon clipping routines written by Forest Hale and placed into public domain. */ +#include "quakedef.h" + #include #include "polygon.h" @@ -28,7 +30,7 @@ void PolygonF_QuadForPlane(float *outpoints, float planenormalx, float planenorm 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; @@ -96,13 +98,11 @@ 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; + double frac, pdist, ndist; for (i = 0;i < innumpoints;i++) { p = inpoints + i * 3; @@ -111,6 +111,8 @@ void PolygonF_Divide(unsigned int innumpoints, const float *inpoints, float plan 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,19 +133,20 @@ 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++; } @@ -152,15 +155,15 @@ void PolygonF_Divide(unsigned int innumpoints, const float *inpoints, float plan *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; for (i = 0;i < innumpoints;i++) { p = inpoints + i * 3; @@ -169,6 +172,8 @@ void PolygonD_Divide(unsigned int innumpoints, const double *inpoints, double pl ndist = n[0] * planenormalx + n[1] * planenormaly + n[2] * planenormalz - planedist; if (pdist >= -epsilon) { + if (pdist <= epsilon) + oncount++; if (frontcount < outfrontmaxpoints) { *outfrontpoints++ = p[0]; @@ -189,6 +194,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) { @@ -210,5 +216,7 @@ void PolygonD_Divide(unsigned int innumpoints, const double *inpoints, double pl *neededfrontpoints = frontcount; if (neededbackpoints) *neededbackpoints = backcount; + if (oncountpointer) + *oncountpointer = oncount; }