6 static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2);
7 static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2);
9 void g3d_polyfill(struct g3d_vertex *verts)
11 int i, topidx, botidx, mididx;
13 struct g3d_vertex vtmp;
17 if(verts[i].y < verts[topidx].y) {
20 if(verts[i].y > verts[botidx].y) {
24 mididx = (topidx + 1) % 3;
25 if(mididx == botidx) mididx = (mididx + 1) % 3;
27 dy = verts[botidx].y - verts[topidx].y;
30 dx = verts[botidx].x - verts[topidx].x;
31 dym = verts[mididx].y - verts[topidx].y;
32 vtmp.x = muldiv(dx, dym, dy) + verts[topidx].x; /* dx * dym / dy + vtop.x */
33 vtmp.y = verts[mididx].y;
35 if(verts[topidx].y != verts[mididx].y) {
36 filltop(verts + topidx, verts + mididx, &vtmp);
38 if(verts[mididx].y != verts[botidx].y) {
39 fillbot(verts + mididx, &vtmp, verts + botidx);
43 static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2)
45 struct g3d_vertex *vtmp;
46 int x, xn, y, endy, len;
47 int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy;
58 if(endy > YRES) endy = YRES;
61 fbptr = g3d_fbpixels + y * XRES + x;
67 dxldy = (dxl << 8) / dy;
68 dxrdy = (dxr << 8) / dy;
73 if(len > 0) memset(fbptr, g3d_curcidx, len);
79 fbptr += XRES + (xn - x);
84 static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2)
86 struct g3d_vertex *vtmp;
87 int x, xn, y, endy, len;
88 int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy;
99 if(endy > YRES) endy = YRES;
102 fbptr = g3d_fbpixels + y * XRES + x;
109 dxldy = (dxl << 8) / dy;
110 dxrdy = (dxr << 8) / dy;
114 len = (xr - xl) >> 8;
115 if(len > 0) memset(fbptr, g3d_curcidx, len);
121 fbptr += XRES + (xn - x);