# HG changeset patch # User John Tsiombikas # Date 1403508804 -10800 # Node ID c398d834d64a898508b0274d5485f30bdd0e63fa # Parent 2070a81127f21dcdd5ae21f0c042870f61ac81f8 fixed the rendering bugs diff -r 2070a81127f2 -r c398d834d64a src/game.c --- a/src/game.c Mon Jun 23 08:28:28 2014 +0300 +++ b/src/game.c Mon Jun 23 10:33:24 2014 +0300 @@ -7,6 +7,8 @@ #include "palman.h" #include "ggen.h" +extern int dbg_fill_dump; + static void draw_rect(int x, int y, int w, int h, uint16_t color); #define X16INT(x) ((x) << 16) @@ -65,9 +67,13 @@ } x3d_translate(itox16(WIDTH / 2), itox16(HEIGHT / 2), 0);*/ + x3d_translate(0, 0, X16INT(6)); x3d_rotate(cam_phi, 65536, 0, 0); - x3d_rotate(keyrot << 16, 0, 65536, 0); - x3d_translate(0, 0, X16INT(6)); + if(autorot) { + x3d_rotate((msec / 64) << 16, 0, 65536, 0); + } else { + x3d_rotate(cam_theta, 0, 65536, 0); + } #ifdef PALMODE x3d_color_index(255); @@ -102,17 +108,29 @@ switch(key) { case KEY_LEFT: - keyrot--; + cam_theta += 65536; break; case KEY_RIGHT: - keyrot++; + cam_theta -= 65536; + break; + + case KEY_UP: + cam_phi += 65536; + break; + + case KEY_DOWN: + cam_phi -= 65536; break; case KEY_A: autorot = !autorot; break; + case KEY_SELECT: + dbg_fill_dump = 1; + break; + default: break; } diff -r 2070a81127f2 -r c398d834d64a src/ggen.c --- a/src/ggen.c Mon Jun 23 08:28:28 2014 +0300 +++ b/src/ggen.c Mon Jun 23 10:33:24 2014 +0300 @@ -20,8 +20,8 @@ int gen_box(struct mesh *m) { int i; - int num_faces = 8; - int num_verts = num_faces * 4; + int num_faces = 12; + int num_verts = num_faces * 3; int32_t v[8][3] = { {-X1, -X1, -X1}, {X1, -X1, -X1}, {X1, -X1, X1}, {-X1, -X1, X1}, {-X1, X1, -X1}, {X1, X1, -X1}, {X1, X1, X1}, {-X1, X1, X1} @@ -29,7 +29,7 @@ int32_t *vptr, *cptr; - m->prim = X3D_QUADS; + m->prim = X3D_TRIANGLES; m->nverts = num_verts; if(!(m->verts = malloc(num_verts * 3 * sizeof *m->verts))) { return -1; @@ -45,43 +45,67 @@ VERTEX(v[0][0], v[0][1], v[0][2]); VERTEX(v[1][0], v[1][1], v[1][2]); VERTEX(v[2][0], v[2][1], v[2][2]); + for(i=0; i<3; i++) COLOR(32768, 0, 32768); + + VERTEX(v[0][0], v[0][1], v[0][2]); + VERTEX(v[2][0], v[2][1], v[2][2]); VERTEX(v[3][0], v[3][1], v[3][2]); - for(i=0; i<4; i++) COLOR(65536, 0, 65536); + for(i=0; i<3; i++) COLOR(65536, 0, 65536); /* +Y */ + VERTEX(v[7][0], v[7][1], v[7][2]); + VERTEX(v[6][0], v[6][1], v[6][2]); + VERTEX(v[5][0], v[5][1], v[5][2]); + for(i=0; i<3; i++) COLOR(0, 32768, 0); + + VERTEX(v[7][0], v[7][1], v[7][2]); + VERTEX(v[5][0], v[5][1], v[5][2]); VERTEX(v[4][0], v[4][1], v[4][2]); - VERTEX(v[5][0], v[5][1], v[5][2]); - VERTEX(v[6][0], v[6][1], v[6][2]); - VERTEX(v[7][0], v[7][1], v[7][2]); - for(i=0; i<4; i++) COLOR(0, 65536, 0); + for(i=0; i<3; i++) COLOR(0, 65536, 0); /* -Z */ VERTEX(v[0][0], v[0][1], v[0][2]); VERTEX(v[4][0], v[4][1], v[4][2]); VERTEX(v[5][0], v[5][1], v[5][2]); + for(i=0; i<3; i++) COLOR(32768, 32768, 0); + + VERTEX(v[0][0], v[0][1], v[0][2]); + VERTEX(v[5][0], v[5][1], v[5][2]); VERTEX(v[1][0], v[1][1], v[1][2]); - for(i=0; i<4; i++) COLOR(65536, 65536, 0); + for(i=0; i<3; i++) COLOR(65536, 65536, 0); /* +Z */ VERTEX(v[2][0], v[2][1], v[2][2]); VERTEX(v[6][0], v[6][1], v[6][2]); VERTEX(v[7][0], v[7][1], v[7][2]); + for(i=0; i<3; i++) COLOR(0, 0, 32768); + + VERTEX(v[2][0], v[2][1], v[2][2]); + VERTEX(v[7][0], v[7][1], v[7][2]); VERTEX(v[3][0], v[3][1], v[3][2]); - for(i=0; i<4; i++) COLOR(0, 0, 65536); + for(i=0; i<3; i++) COLOR(0, 0, 65536); /* +X */ VERTEX(v[1][0], v[1][1], v[1][2]); VERTEX(v[5][0], v[5][1], v[5][2]); VERTEX(v[6][0], v[6][1], v[6][2]); + for(i=0; i<3; i++) COLOR(32768, 0, 0); + + VERTEX(v[1][0], v[1][1], v[1][2]); + VERTEX(v[6][0], v[6][1], v[6][2]); VERTEX(v[2][0], v[2][1], v[2][2]); - for(i=0; i<4; i++) COLOR(65536, 0, 0); + for(i=0; i<3; i++) COLOR(65536, 0, 0); /* -X */ VERTEX(v[3][0], v[3][1], v[3][2]); VERTEX(v[7][0], v[7][1], v[7][2]); VERTEX(v[4][0], v[4][1], v[4][2]); + for(i=0; i<3; i++) COLOR(0, 32768, 32768); + + VERTEX(v[3][0], v[3][1], v[3][2]); + VERTEX(v[4][0], v[4][1], v[4][2]); VERTEX(v[0][0], v[0][1], v[0][2]); - for(i=0; i<4; i++) COLOR(0, 65536, 65536); + for(i=0; i<3; i++) COLOR(0, 65536, 65536); return 0; } diff -r 2070a81127f2 -r c398d834d64a src/polyfill.c --- a/src/polyfill.c Mon Jun 23 08:28:28 2014 +0300 +++ b/src/polyfill.c Mon Jun 23 10:33:24 2014 +0300 @@ -10,6 +10,7 @@ static void fill_scanline_pal(int y, int x0, int x1, uint8_t color); static void fill_scanline_rgb(int y, int x0, int x1, uint16_t color); +static int winding(int32_t x0, int32_t y0, int32_t x1, int32_t y1); void draw_poly(int num, const pvec3 *verts, uint16_t color) { @@ -19,6 +20,17 @@ int32_t ldy = 0, rdy = 0, ldxdy, rdxdy; int32_t lx, rx; int start, end; + pvec3 v0, v1; + + v0.x = verts[1].x - verts[0].x; + v0.y = verts[1].y - verts[0].y; + + v1.x = verts[2].x - verts[0].x; + v1.y = verts[2].y - verts[0].y; + + if(winding(v0.x, v0.y, v1.x, v1.y) < 0) { + return; /* backface */ + } topy = boty = verts[0].y; for(i=1; i> 16; end = boty >> 16; if(end >= HEIGHT) end = HEIGHT - 1; y = topy; - for(i=start; i= verts[lidx[1]].y) { @@ -91,7 +98,11 @@ if(ldy < 0) { break; } - ldxdy = x16div(verts[lidx[1]].x - lx, ldy); + if(ldy) { + ldxdy = x16div(verts[lidx[1]].x - lx, ldy); + } else { + ldxdy = verts[lidx[1]].x - lx; + } } if(y >= verts[ridx[1]].y) { rx = verts[ridx[1]].x; @@ -101,13 +112,17 @@ if(rdy < 0) { break; } - rdxdy = x16div(verts[ridx[1]].x - rx, rdy); + if(rdy) { + rdxdy = x16div(verts[ridx[1]].x - rx, rdy); + } else { + rdxdy = verts[ridx[1]].x - rx; + } } - x0 = lx < 0 ? 0 : (lx >> 16); - x1 = (rx >> 16) >= WIDTH ? WIDTH - 1 : (rx >> 16); + x0 = lx >> 16; + x1 = rx >> 16; - if(i >= 0 && x1 > x0) { + if(i >= 0) {// && x0 < x1) { #ifdef PALMODE fill_scanline_pal(i, x0, x1, (uint8_t)color); #else @@ -158,8 +173,18 @@ static void fill_scanline_rgb(int y, int x0, int x1, uint16_t color) { int i; - uint16_t *pixels = (uint16_t*)back_buffer->pixels + y * WIDTH + x0; + uint16_t *pixels; + if(x0 > x1) { + i = x0; + x0 = x1; + x1 = i; + } + + if(x0 < 0) x0 = 0; + if(x1 >= WIDTH - 1) x1 = WIDTH - 1; + + pixels = (uint16_t*)back_buffer->pixels + y * WIDTH + x0; for(i=x0; i #include #include #include "x3d.h" @@ -8,6 +9,8 @@ #include "polyfill.h" #include "gbasys.h" +int dbg_fill_dump; + #define MAT_STACK_SIZE 4 struct matrix { @@ -15,6 +18,7 @@ }; static void proc_vertex(const int32_t *vin, const int32_t *cin, pvec3 *vout, pvec3 *cout); +static int dump_frame(struct pixel_buffer *frame); static int32_t proj_fov = M_PI_X16; @@ -88,11 +92,11 @@ for(i=0; i<3; i++) { for(j=0; j<4; j++) { mstack[mtop].m[M(i, j)] = - x16mul(tmp.m[M(0, j)], m[M(i, 0)]) + - x16mul(tmp.m[M(1, j)], m[M(i, 1)]) + - x16mul(tmp.m[M(2, j)], m[M(i, 2)]); + x16mul(m[M(0, j)], tmp.m[M(i, 0)]) + + x16mul(m[M(1, j)], tmp.m[M(i, 1)]) + + x16mul(m[M(2, j)], tmp.m[M(i, 2)]); } - mstack[mtop].m[M(i, 3)] += m[M(i, 3)]; + mstack[mtop].m[M(i, 3)] += tmp.m[M(i, 3)]; } } @@ -236,10 +240,15 @@ case X3D_TRIANGLES: case X3D_QUADS: draw_poly(pverts, vpos, color); + if(dbg_fill_dump) { + dump_frame(back_buffer); + } break; } skip_prim: ; } + + dbg_fill_dump = 0; return 0; } @@ -287,3 +296,31 @@ im_color[1] = g; im_color[2] = b; } + +static int dump_frame(struct pixel_buffer *frame) +{ + static int frameno; + char buf[128]; + FILE *fp; + int i, npix; + uint16_t *ptr = frame->pixels; + + sprintf(buf, "dump%03d.ppm", ++frameno); + + if(!(fp = fopen(buf, "wb"))) { + fprintf(stderr, "failed to dump file: %s\n", buf); + return -1; + } + + fprintf(fp, "P6\n%d %d\n255\n", frame->x, frame->y); + + npix = frame->x * frame->y; + for(i=0; i