grid axes
[gba_blender] / src / xgl.c
index 6277ce5..4880aba 100644 (file)
--- a/src/xgl.c
+++ b/src/xgl.c
@@ -29,6 +29,9 @@ static int mtop;
 static unsigned int opt;
 static int32_t ldir[3];
 
+static void draw_ptlines(int prim, const struct xvertex *varr, int vcount);
+
+
 void xgl_init(void)
 {
        xgl_viewport(0, 0, 240, 160);
@@ -190,6 +193,11 @@ void xgl_draw(int prim, const struct xvertex *varr, int vcount)
        struct pvertex pv[4];
        int32_t ndotl;
 
+       if(prim < 3) {
+               draw_ptlines(prim, varr, vcount);
+               return;
+       }
+
        while(vcount >= prim) {
                cidx = varr->cidx;
 
@@ -234,3 +242,28 @@ void xgl_draw(int prim, const struct xvertex *varr, int vcount)
                polyfill_flat(pv, prim, cidx);
        }
 }
+
+static void draw_ptlines(int prim, const struct xvertex *varr, int vcount)
+{
+       int i;
+       struct xvertex xv[2];
+
+       while(vcount >= prim) {
+               for(i=0; i<prim; i++) {
+                       xform(xv + i, varr, mat[mtop]);
+
+                       xv[i].x = (xv[i].x << 1) / (xv[i].z >> 8);      /* assume aspect: ~2 */
+                       xv[i].y = (xv[i].y << 2) / (xv[i].z >> 8);      /* the shift is * PROJ_D */
+                       /* projection result is 24.8 */
+                       /* viewport */
+                       xv[i].x = ((((xv[i].x + 0x100) >> 1) * vp[2]) >> 8) + vp[0];
+                       xv[i].y = ((((0x100 - xv[i].y) >> 1) * vp[3]) >> 8) + vp[1];
+                       varr++;
+               }
+               vcount -= prim;
+
+               /* line clipping */
+               clip_line((int*)&xv[0].x, (int*)&xv[0].y, (int*)&xv[1].x, (int*)&xv[1].y, vp[0], vp[1], vp[2] - 1, vp[3] - 1);
+               draw_line(xv[0].x, xv[0].y, xv[1].x, xv[1].y, varr[-2].cidx);
+       }
+}