-#include <stdio.h>\r
-#include <string.h>\r
-#include "3dgfx.h"\r
-#include "util.h"\r
-\r
-static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2);\r
-static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2);\r
-\r
-void g3d_polyfill(struct g3d_vertex *verts)\r
-{\r
- int i, topidx, botidx, mididx;\r
- int32_t dx, dy, dym;\r
- struct g3d_vertex vtmp;\r
-\r
- topidx = botidx = 0;\r
- for(i=1; i<3; i++) {\r
- if(verts[i].y < verts[topidx].y) {\r
- topidx = i;\r
- }\r
- if(verts[i].y > verts[botidx].y) {\r
- botidx = i;\r
- }\r
- }\r
- mididx = (topidx + 1) % 3;\r
- if(mididx == botidx) mididx = (mididx + 1) % 3;\r
-\r
- dy = verts[botidx].y - verts[topidx].y;\r
- if(dy == 0) return;\r
-\r
- dx = verts[botidx].x - verts[topidx].x;\r
- dym = verts[mididx].y - verts[topidx].y;\r
- vtmp.x = muldiv(dx, dym, dy) + verts[topidx].x; /* dx * dym / dy + vtop.x */\r
- vtmp.y = verts[mididx].y;\r
-\r
- if(verts[topidx].y != verts[mididx].y) {\r
- filltop(verts + topidx, verts + mididx, &vtmp);\r
- }\r
- if(verts[mididx].y != verts[botidx].y) {\r
- fillbot(verts + mididx, &vtmp, verts + botidx);\r
- }\r
-}\r
-\r
-static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2)\r
-{\r
- struct g3d_vertex *vtmp;\r
- int x, xn, y, endy, len;\r
- int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy;\r
- unsigned char *fbptr;\r
-\r
- if(v1->x > v2->x) {\r
- vtmp = v1;\r
- v1 = v2;\r
- v2 = vtmp;\r
- }\r
-\r
- y = v0->y >> 8;\r
- endy = v1->y >> 8;\r
- x = v0->x >> 8;\r
-\r
- fbptr = g3d_fbpixels + y * XRES + x;\r
-\r
- xl = xr = v0->x;\r
- dy = v1->y - v0->y;\r
- dxl = v1->x - v0->x;\r
- dxr = v2->x - v0->x;\r
- dxldy = (dxl << 8) / dy;\r
- dxrdy = (dxr << 8) / dy;\r
-\r
- while(y++ < endy) {\r
- len = (xr - xl) >> 8;\r
- if(len > 0) memset(fbptr, g3d_curcidx, len);\r
-\r
- xl += dxldy;\r
- xr += dxrdy;\r
- xn = xl >> 8;\r
- fbptr += XRES + (xn - x);\r
- x = xn;\r
- }\r
-}\r
-\r
-static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2)\r
-{\r
- struct g3d_vertex *vtmp;\r
- int x, xn, y, endy, len;\r
- int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy;\r
- unsigned char *fbptr;\r
-\r
- if(v0->x > v1->x) {\r
- vtmp = v0;\r
- v0 = v1;\r
- v1 = vtmp;\r
- }\r
-\r
- y = v0->y >> 8;\r
- endy = v2->y >> 8;\r
- x = v0->x >> 8;\r
-\r
- fbptr = g3d_fbpixels + y * XRES + x;\r
-\r
- xl = v0->x;\r
- xr = v1->x;\r
- dy = v2->y - v0->y;\r
- dxl = v2->x - v0->x;\r
- dxr = v2->x - v1->x;\r
- dxldy = (dxl << 8) / dy;\r
- dxrdy = (dxr << 8) / dy;\r
-\r
- while(y++ < endy) {\r
- len = (xr - xl) >> 8;\r
- if(len > 0) memset(fbptr, g3d_curcidx, len);\r
-\r
- xl += dxldy;\r
- xr += dxrdy;\r
- xn = xl >> 8;\r
- fbptr += XRES + (xn - x);\r
- x = xn;\r
- }\r
-}\r
+#include <stdio.h>
+#include <string.h>
+#include "3dgfx.h"
+#include "util.h"
+
+static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2);
+static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2);
+
+void g3d_polyfill(struct g3d_vertex *verts)
+{
+ int i, topidx, botidx, mididx;
+ int32_t dx, dy, dym;
+ struct g3d_vertex vtmp;
+
+ topidx = botidx = 0;
+ for(i=1; i<3; i++) {
+ if(verts[i].y < verts[topidx].y) {
+ topidx = i;
+ }
+ if(verts[i].y > verts[botidx].y) {
+ botidx = i;
+ }
+ }
+ mididx = (topidx + 1) % 3;
+ if(mididx == botidx) mididx = (mididx + 1) % 3;
+
+ dy = verts[botidx].y - verts[topidx].y;
+ if(dy == 0) return;
+
+ dx = verts[botidx].x - verts[topidx].x;
+ dym = verts[mididx].y - verts[topidx].y;
+ vtmp.x = muldiv(dx, dym, dy) + verts[topidx].x; /* dx * dym / dy + vtop.x */
+ vtmp.y = verts[mididx].y;
+
+ if(verts[topidx].y != verts[mididx].y) {
+ filltop(verts + topidx, verts + mididx, &vtmp);
+ }
+ if(verts[mididx].y != verts[botidx].y) {
+ fillbot(verts + mididx, &vtmp, verts + botidx);
+ }
+}
+
+static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2)
+{
+ struct g3d_vertex *vtmp;
+ int x, xn, y, endy, len;
+ int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy;
+ unsigned char *fbptr;
+
+ if(v1->x > v2->x) {
+ vtmp = v1;
+ v1 = v2;
+ v2 = vtmp;
+ }
+
+ y = v0->y >> 8;
+ endy = v1->y >> 8;
+ if(endy > YRES) endy = YRES;
+ x = v0->x >> 8;
+
+ fbptr = g3d_fbpixels + y * XRES + x;
+
+ xl = xr = v0->x;
+ dy = v1->y - v0->y;
+ dxl = v1->x - v0->x;
+ dxr = v2->x - v0->x;
+ dxldy = (dxl << 8) / dy;
+ dxrdy = (dxr << 8) / dy;
+
+ while(y++ < endy) {
+ if(y > 0) {
+ len = (xr - xl) >> 8;
+ if(len > 0) memset(fbptr, g3d_curcidx, len);
+ }
+
+ xl += dxldy;
+ xr += dxrdy;
+ xn = xl >> 8;
+ fbptr += XRES + (xn - x);
+ x = xn;
+ }
+}
+
+static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2)
+{
+ struct g3d_vertex *vtmp;
+ int x, xn, y, endy, len;
+ int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy;
+ unsigned char *fbptr;
+
+ if(v0->x > v1->x) {
+ vtmp = v0;
+ v0 = v1;
+ v1 = vtmp;
+ }
+
+ y = v0->y >> 8;
+ endy = v2->y >> 8;
+ if(endy > YRES) endy = YRES;
+ x = v0->x >> 8;
+
+ fbptr = g3d_fbpixels + y * XRES + x;
+
+ xl = v0->x;
+ xr = v1->x;
+ dy = v2->y - v0->y;
+ dxl = v2->x - v0->x;
+ dxr = v2->x - v1->x;
+ dxldy = (dxl << 8) / dy;
+ dxrdy = (dxr << 8) / dy;
+
+ while(y++ < endy) {
+ if(y > 0) {
+ len = (xr - xl) >> 8;
+ if(len > 0) memset(fbptr, g3d_curcidx, len);
+ }
+
+ xl += dxldy;
+ xr += dxrdy;
+ xn = xl >> 8;
+ fbptr += XRES + (xn - x);
+ x = xn;
+ }
+}