156 void (*func)(
void *,
int,
int,
float,
float))
158 float x0, y0, x1, y1, x2, y2, z0, z1, z2;
159 float u,
v, uxd, uyd, vxd, vyd, uy0, vy0, xx1;
160 const float *span1, *span2;
161 int i, j,
x,
y, sn1, sn2, rectx = zspan->
rectx, my0, my2;
172 if (zspan->
minp2 ==
nullptr || zspan->
maxp2 ==
nullptr) {
193 x0 = y1 * z2 - z1 * y2;
194 y0 = z1 * x2 - x1 * z2;
195 z0 = x1 * y2 - y1 * x2;
201 xx1 = (x0 * v1[0] + y0 * v1[1]) / z0 + 1.0f;
202 uxd = -double(x0) / double(z0);
203 uyd = -double(y0) / double(z0);
204 uy0 = double(my2) * uyd + double(xx1);
209 x0 = y1 * z2 - z1 * y2;
210 y0 = z1 * x2 - x1 * z2;
212 xx1 = (x0 * v1[0] + y0 * v1[1]) / z0;
213 vxd = -double(x0) / double(z0);
214 vyd = -double(y0) / double(z0);
215 vy0 = double(my2) * vyd + double(xx1);
218 span1 = zspan->
span1 + my2;
219 span2 = zspan->
span2 + my2;
221 for (
i = 0,
y = my2;
y >= my0;
i++,
y--, span1--, span2--) {
230 sn1 = std::max(sn1, 0);
232 u = ((double(sn1) * uxd) + uy0) - (
i * uyd);
233 v = ((double(sn1) * vxd) + vy0) - (
i * vyd);
235 for (j = 0,
x = sn1;
x <= sn2; j++,
x++) {
236 func(handle,
x,
y, u + (j * uxd),
v + (j * vxd));
void zspan_scanconvert(ZSpan *zspan, void *handle, float *v1, float *v2, float *v3, void(*func)(void *, int, int, float, float))