3 Polygon clipping routines written by Forest Hale and placed into public domain.
9 void PolygonF_QuadForPlane(float *outpoints, float planenormalx, float planenormaly, float planenormalz, float planedist, float quadsize)
11 float d, quadright[3], quadup[3];
12 if (fabs(planenormalz) > fabs(planenormalx) && fabs(planenormalz) > fabs(planenormaly))
24 // d = -DotProduct(quadup, planenormal);
25 d = -(quadup[0] * planenormalx + quadup[1] * planenormaly + quadup[2] * planenormalz);
26 // VectorMA(quadup, d, planenormal, quadup);
27 quadup[0] += d * planenormalx;
28 quadup[1] += d * planenormaly;
29 quadup[2] += d * planenormalz;
30 // VectorNormalize(quadup);
31 d = (float)(1.0 / sqrt(quadup[0] * quadup[0] + quadup[1] * quadup[1] + quadup[2] * quadup[2]));
35 // CrossProduct(quadup,planenormal,quadright);
36 quadright[0] = quadup[1] * planenormalz - quadup[2] * planenormaly;
37 quadright[1] = quadup[2] * planenormalx - quadup[0] * planenormalz;
38 quadright[2] = quadup[0] * planenormaly - quadup[1] * planenormalx;
40 outpoints[0] = planedist * planenormalx - quadsize * quadright[0] + quadsize * quadup[0];
41 outpoints[1] = planedist * planenormaly - quadsize * quadright[1] + quadsize * quadup[1];
42 outpoints[2] = planedist * planenormalz - quadsize * quadright[2] + quadsize * quadup[2];
43 outpoints[3] = planedist * planenormalx + quadsize * quadright[0] + quadsize * quadup[0];
44 outpoints[4] = planedist * planenormaly + quadsize * quadright[1] + quadsize * quadup[1];
45 outpoints[5] = planedist * planenormalz + quadsize * quadright[2] + quadsize * quadup[2];
46 outpoints[6] = planedist * planenormalx + quadsize * quadright[0] - quadsize * quadup[0];
47 outpoints[7] = planedist * planenormaly + quadsize * quadright[1] - quadsize * quadup[1];
48 outpoints[8] = planedist * planenormalz + quadsize * quadright[2] - quadsize * quadup[2];
49 outpoints[9] = planedist * planenormalx - quadsize * quadright[0] - quadsize * quadup[0];
50 outpoints[10] = planedist * planenormaly - quadsize * quadright[1] - quadsize * quadup[1];
51 outpoints[11] = planedist * planenormalz - quadsize * quadright[2] - quadsize * quadup[2];
54 void PolygonD_QuadForPlane(double *outpoints, double planenormalx, double planenormaly, double planenormalz, double planedist, double quadsize)
56 double d, quadright[3], quadup[3];
57 if (fabs(planenormalz) > fabs(planenormalx) && fabs(planenormalz) > fabs(planenormaly))
69 // d = -DotProduct(quadup, planenormal);
70 d = -(quadup[0] * planenormalx + quadup[1] * planenormaly + quadup[2] * planenormalz);
71 // VectorMA(quadup, d, planenormal, quadup);
72 quadup[0] += d * planenormalx;
73 quadup[1] += d * planenormaly;
74 quadup[2] += d * planenormalz;
75 // VectorNormalize(quadup);
76 d = 1.0 / sqrt(quadup[0] * quadup[0] + quadup[1] * quadup[1] + quadup[2] * quadup[2]);
80 // CrossProduct(quadup,planenormal,quadright);
81 quadright[0] = quadup[1] * planenormalz - quadup[2] * planenormaly;
82 quadright[1] = quadup[2] * planenormalx - quadup[0] * planenormalz;
83 quadright[2] = quadup[0] * planenormaly - quadup[1] * planenormalx;
85 outpoints[0] = planedist * planenormalx - quadsize * quadright[0] + quadsize * quadup[0];
86 outpoints[1] = planedist * planenormaly - quadsize * quadright[1] + quadsize * quadup[1];
87 outpoints[2] = planedist * planenormalz - quadsize * quadright[2] + quadsize * quadup[2];
88 outpoints[3] = planedist * planenormalx + quadsize * quadright[0] + quadsize * quadup[0];
89 outpoints[4] = planedist * planenormaly + quadsize * quadright[1] + quadsize * quadup[1];
90 outpoints[5] = planedist * planenormalz + quadsize * quadright[2] + quadsize * quadup[2];
91 outpoints[6] = planedist * planenormalx + quadsize * quadright[0] - quadsize * quadup[0];
92 outpoints[7] = planedist * planenormaly + quadsize * quadright[1] - quadsize * quadup[1];
93 outpoints[8] = planedist * planenormalz + quadsize * quadright[2] - quadsize * quadup[2];
94 outpoints[9] = planedist * planenormalx - quadsize * quadright[0] - quadsize * quadup[0];
95 outpoints[10] = planedist * planenormaly - quadsize * quadright[1] - quadsize * quadup[1];
96 outpoints[11] = planedist * planenormalz - quadsize * quadright[2] - quadsize * quadup[2];
99 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)
101 int i, frontcount = 0, backcount = 0, oncount = 0;
103 double frac, pdist, ndist;
104 for (i = 0;i < innumpoints;i++)
106 p = inpoints + i * 3;
107 n = inpoints + ((i + 1) < innumpoints ? (i + 1) : 0) * 3;
108 pdist = p[0] * planenormalx + p[1] * planenormaly + p[2] * planenormalz - planedist;
109 ndist = n[0] * planenormalx + n[1] * planenormaly + n[2] * planenormalz - planedist;
110 if (pdist >= -epsilon)
112 if (pdist <= epsilon)
114 if (frontcount < outfrontmaxpoints)
116 *outfrontpoints++ = p[0];
117 *outfrontpoints++ = p[1];
118 *outfrontpoints++ = p[2];
122 if (pdist <= epsilon)
124 if (backcount < outbackmaxpoints)
126 *outbackpoints++ = p[0];
127 *outbackpoints++ = p[1];
128 *outbackpoints++ = p[2];
132 if ((pdist > epsilon && ndist < -epsilon) || (pdist < -epsilon && ndist > epsilon))
135 frac = pdist / (pdist - ndist);
136 if (frontcount < outfrontmaxpoints)
138 *outfrontpoints++ = (float)(p[0] + frac * (n[0] - p[0]));
139 *outfrontpoints++ = (float)(p[1] + frac * (n[1] - p[1]));
140 *outfrontpoints++ = (float)(p[2] + frac * (n[2] - p[2]));
143 if (backcount < outbackmaxpoints)
145 *outbackpoints++ = (float)(p[0] + frac * (n[0] - p[0]));
146 *outbackpoints++ = (float)(p[1] + frac * (n[1] - p[1]));
147 *outbackpoints++ = (float)(p[2] + frac * (n[2] - p[2]));
152 if (neededfrontpoints)
153 *neededfrontpoints = frontcount;
154 if (neededbackpoints)
155 *neededbackpoints = backcount;
157 *oncountpointer = oncount;
160 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)
162 int i, frontcount = 0, backcount = 0, oncount = 0;
164 double frac, pdist, ndist;
165 for (i = 0;i < innumpoints;i++)
167 p = inpoints + i * 3;
168 n = inpoints + ((i + 1) < innumpoints ? (i + 1) : 0) * 3;
169 pdist = p[0] * planenormalx + p[1] * planenormaly + p[2] * planenormalz - planedist;
170 ndist = n[0] * planenormalx + n[1] * planenormaly + n[2] * planenormalz - planedist;
171 if (pdist >= -epsilon)
173 if (pdist <= epsilon)
175 if (frontcount < outfrontmaxpoints)
177 *outfrontpoints++ = p[0];
178 *outfrontpoints++ = p[1];
179 *outfrontpoints++ = p[2];
183 if (pdist <= epsilon)
185 if (backcount < outbackmaxpoints)
187 *outbackpoints++ = p[0];
188 *outbackpoints++ = p[1];
189 *outbackpoints++ = p[2];
193 if ((pdist > epsilon && ndist < -epsilon) || (pdist < -epsilon && ndist > epsilon))
196 frac = pdist / (pdist - ndist);
197 if (frontcount < outfrontmaxpoints)
199 *outfrontpoints++ = p[0] + frac * (n[0] - p[0]);
200 *outfrontpoints++ = p[1] + frac * (n[1] - p[1]);
201 *outfrontpoints++ = p[2] + frac * (n[2] - p[2]);
204 if (backcount < outbackmaxpoints)
206 *outbackpoints++ = p[0] + frac * (n[0] - p[0]);
207 *outbackpoints++ = p[1] + frac * (n[1] - p[1]);
208 *outbackpoints++ = p[2] + frac * (n[2] - p[2]);
213 if (neededfrontpoints)
214 *neededfrontpoints = frontcount;
215 if (neededbackpoints)
216 *neededbackpoints = backcount;
218 *oncountpointer = oncount;