6 static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2);
\r
7 static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2);
\r
9 void g3d_polyfill(struct g3d_vertex *verts)
\r
11 int i, topidx, botidx, mididx;
\r
12 int32_t dx, dy, dym;
\r
13 struct g3d_vertex vtmp;
\r
15 topidx = botidx = 0;
\r
16 for(i=1; i<3; i++) {
\r
17 if(verts[i].y < verts[topidx].y) {
\r
20 if(verts[i].y > verts[botidx].y) {
\r
24 mididx = (topidx + 1) % 3;
\r
25 if(mididx == botidx) mididx = (mididx + 1) % 3;
\r
27 dy = verts[botidx].y - verts[topidx].y;
\r
30 dx = verts[botidx].x - verts[topidx].x;
\r
31 dym = verts[mididx].y - verts[topidx].y;
\r
32 vtmp.x = muldiv(dx, dym, dy) + verts[topidx].x; /* dx * dym / dy + vtop.x */
\r
33 vtmp.y = verts[mididx].y;
\r
35 if(verts[topidx].y != verts[mididx].y) {
\r
36 filltop(verts + topidx, verts + mididx, &vtmp);
\r
38 if(verts[mididx].y != verts[botidx].y) {
\r
39 fillbot(verts + mididx, &vtmp, verts + botidx);
\r
43 static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2)
\r
45 struct g3d_vertex *vtmp;
\r
46 int x, xn, y, endy, len;
\r
47 int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy;
\r
48 unsigned char *fbptr;
\r
60 fbptr = g3d_fbpixels + y * XRES + x;
\r
64 dxl = v1->x - v0->x;
\r
65 dxr = v2->x - v0->x;
\r
66 dxldy = (dxl << 8) / dy;
\r
67 dxrdy = (dxr << 8) / dy;
\r
70 len = (xr - xl) >> 8;
\r
71 if(len > 0) memset(fbptr, g3d_curcidx, len);
\r
76 fbptr += XRES + (xn - x);
\r
81 static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2)
\r
83 struct g3d_vertex *vtmp;
\r
84 int x, xn, y, endy, len;
\r
85 int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy;
\r
86 unsigned char *fbptr;
\r
98 fbptr = g3d_fbpixels + y * XRES + x;
\r
102 dy = v2->y - v0->y;
\r
103 dxl = v2->x - v0->x;
\r
104 dxr = v2->x - v1->x;
\r
105 dxldy = (dxl << 8) / dy;
\r
106 dxrdy = (dxr << 8) / dy;
\r
108 while(y++ < endy) {
\r
109 len = (xr - xl) >> 8;
\r
110 if(len > 0) memset(fbptr, g3d_curcidx, len);
\r
115 fbptr += XRES + (xn - x);
\r