mesh, obj loading, sorting, shitty normals...
[dos_low3d] / src / 3dgfx.c
index 3ebaa59..e56fdcf 100644 (file)
@@ -107,7 +107,7 @@ void g3d_color(int cidx)
        g3d_curcidx = cidx;
 }
 
-static const int primverts[] = {1, 2, 3, 4};
+static const int primverts[] = {0, 1, 2, 3, 4};
 
 void g3d_draw(int prim, struct g3d_vertex *varr, int vcount)
 {
@@ -116,11 +116,24 @@ void g3d_draw(int prim, struct g3d_vertex *varr, int vcount)
        prim_vnum = primverts[prim];
 
        for(i=0; i<vcount; i+=prim_vnum) {
-               g3d_draw_prim(prim, varr);
+               g3d_draw_prim(prim, varr, 0);
                varr += prim_vnum;
        }
 }
 
+void g3d_draw_indexed(int prim, struct g3d_vertex *varr, unsigned short *idxarr,
+               int idxcount)
+{
+       int i, j, prim_vnum;
+
+       prim_vnum = primverts[prim];
+
+       for(i=0; i<idxcount; i+=prim_vnum) {
+               g3d_draw_prim(prim, varr, idxarr);
+               idxarr += prim_vnum;
+       }
+}
+
 int32_t vpscale(int32_t x, int32_t s, int32_t shift);
 #pragma aux vpscale = \
        "add eax, 0x100" \
@@ -131,7 +144,7 @@ int32_t vpscale(int32_t x, int32_t s, int32_t shift);
        modify [eax edx];
 
 
-void g3d_draw_prim(int prim, struct g3d_vertex *varr)
+void g3d_draw_prim(int prim, struct g3d_vertex *varr, unsigned short *idxarr)
 {
        int i, vcount, x, y, x1, y1;
        struct g3d_vertex v[4];
@@ -139,7 +152,7 @@ void g3d_draw_prim(int prim, struct g3d_vertex *varr)
        vcount = primverts[prim];
 
        for(i=0; i<vcount; i++) {
-               v[i] = varr[i];
+               v[i] = idxarr ? varr[idxarr[i]] : varr[i];
 
                /* transform to view space */
                g3d_xform(v + i, mvmat);