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);
struct pvertex pv[4];
int32_t ndotl;
+ if(prim < 3) {
+ draw_ptlines(prim, varr, vcount);
+ return;
+ }
+
while(vcount >= prim) {
cidx = varr->cidx;
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);
+ }
+}