optimization: fixed spawn points on color texture
[gbajam22] / src / xgl.c
index 48db220..368c498 100644 (file)
--- a/src/xgl.c
+++ b/src/xgl.c
@@ -29,6 +29,8 @@ static int mtop;
 static unsigned int opt;
 static int32_t ldir[3];
 
+static int cur_cidx;
+
 static void draw_ptlines(int prim, const struct xvertex *varr, int vcount);
 
 
@@ -116,6 +118,7 @@ void xgl_mult_matrix(const int32_t *m2)
        }
 }
 
+/* XXX TODO XXX */
 #define XSIN(x)                (int32_t)(sin(x / 65536.0f) * 65536.0f)
 #define XCOS(x)                (int32_t)(cos(x / 65536.0f) * 65536.0f)
 
@@ -174,6 +177,11 @@ void xgl_scale(int32_t x, int32_t y, int32_t z)
        xgl_mult_matrix(m);
 }
 
+void xgl_index(int cidx)
+{
+       cur_cidx = cidx;
+}
+
 static void xform(struct xvertex *out, const struct xvertex *in, const int32_t *m)
 {
        out->x = XMUL(m[0], in->x) + XMUL(m[4], in->y) + XMUL(m[8], in->z) + m[12];
@@ -191,12 +199,12 @@ static void xform_norm(struct xvertex *out, const struct xvertex *in, const int3
 /* d = 1.0 / tan(fov/2) */
 #define PROJ_D 0x20000
 /* near Z = 0.5 */
-#define NEAR_Z 0x10000
+#define NEAR_Z 0x18000
 
 void xgl_draw(int prim, const struct xvertex *varr, int vcount)
 {
-       int i, cidx;
-       struct xvertex xv[4];
+       int i, cidx, clipnum;
+       struct xvertex xv[4], xvclip[8];
        struct pvertex pv[4];
        int32_t ndotl;
 
@@ -206,14 +214,11 @@ void xgl_draw(int prim, const struct xvertex *varr, int vcount)
        }
 
        while(vcount >= prim) {
-               cidx = 0xff;//varr->cidx;
+               cidx = cur_cidx;//varr->cidx;
 
                xform(xv, varr, mat[mtop]);
                xform_norm(xv, varr, mat[mtop]);
 
-               /* backfacing check */
-               if(xv->nz > 0) goto skip_poly;
-
                /*
                if(opt & XGL_LIGHTING) {
                        ndotl = (xv->nx >> 8) * ldir[0] + (xv->ny >> 8) * ldir[1] + (xv->nz >> 8) * ldir[2];
@@ -223,25 +228,24 @@ void xgl_draw(int prim, const struct xvertex *varr, int vcount)
                }
                */
 
-               for(i=0; i<prim; i++) {
-                       if(i > 0) {
-                               xform(xv + i, varr + i, 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 */
-                       /* transform result is 24.8 */
+               /* transform the rest of the vertices to view space */
+               for(i=1; i<prim; i++) {
+                       xform(xv + i, varr + i, mat[mtop]);
                }
 
                /* clip against near plane */
+               xgl_clip_near(xvclip, &clipnum, xv, prim);
 
-
-               for(i=0; i<prim; i++) {
+               for(i=0; i<clipnum; i++) {
+                       xvclip[i].x = (xvclip[i].x << 1) / (xvclip[i].z >> 8);  /* assume aspect: ~2 */
+                       xvclip[i].y = (xvclip[i].y << 2) / (xvclip[i].z >> 8);  /* the shift is * PROJ_D */
+                       /* transform result is 24.8 */
                        /* viewport */
-                       pv[i].x = (((xv[i].x + 0x100) >> 1) * vp[2]) + (vp[0] << 8);
-                       pv[i].y = (((0x100 - xv[i].y) >> 1) * vp[3]) + (vp[1] << 8);
+                       pv[i].x = (((xvclip[i].x + 0x100) >> 1) * vp[2]) + (vp[0] << 8);
+                       pv[i].y = (((0x100 - xvclip[i].y) >> 1) * vp[3]) + (vp[1] << 8);
                }
 
-               polyfill_flat(pv, prim, cidx);
+               polyfill_flat(pv, clipnum, cidx);
 skip_poly:
                varr += prim;
                vcount -= prim;
@@ -293,7 +297,7 @@ void xgl_xyzzy(void)
        mat[mtop][12] = mat[mtop][13] = 0;
 }
 
-#define ISECT_NEAR(v0, v1)     ((((v0)->z - NEAR_Z) << 8) / (((v0)->z - (v1)->z) >> 8))
+#define ISECT_NEAR(v0, v1)     ((((v0)->z - NEAR_Z) << 8) / ((v0)->z - (v1)->z))
 
 #define LERP_VATTR(res, v0, v1, t) \
        do { \