clipping bugs...
authorJohn Tsiombikas <nuclear@member.fsf.org>
Sat, 3 Feb 2018 22:44:45 +0000 (00:44 +0200)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Sat, 3 Feb 2018 22:44:45 +0000 (00:44 +0200)
src/3dgfx.c
src/metaball.c
src/polytmpl.h
src/sdl/main.c

index 46cc9ab..a90da7a 100644 (file)
@@ -98,9 +98,7 @@ void g3d_framebuffer(int width, int height, void *pixels)
        pfill_fb.width = width;
        pfill_fb.height = height;
 
-       st->vport[0] = st->vport[1] = 0;
-       st->vport[2] = width;
-       st->vport[3] = height;
+       g3d_viewport(0, 0, width, height);
 }
 
 void g3d_viewport(int x, int y, int w, int h)
@@ -404,6 +402,7 @@ void g3d_draw_indexed(int prim, const struct g3d_vertex *varr, int varr_size,
        nfaces = (iarr ? iarr_size : varr_size) / vnum;
 
        for(j=0; j<nfaces; j++) {
+               vnum = prim;    /* reset vnum for each iteration */
 
                for(i=0; i<vnum; i++) {
                        v[i] = iarr ? varr[*iarr++] : *varr++;
@@ -419,15 +418,18 @@ void g3d_draw_indexed(int prim, const struct g3d_vertex *varr, int varr_size,
 
                /* clipping */
                for(i=0; i<6; i++) {
-                       struct g3d_vertex orig[16];
-                       memcpy(orig, v, vnum * sizeof *v);
+                       struct g3d_vertex tmpv[16];
+                       memcpy(tmpv, v, vnum * sizeof *v);
 
-                       if(clip_frustum(v, &vnum, orig, vnum, i) < 0) {
+                       if(clip_frustum(v, &vnum, tmpv, vnum, i) < 0) {
                                /* polygon completely outside of view volume. discard */
-                               return;
+                               vnum = 0;
+                               break;
                        }
                }
 
+               if(!vnum) continue;
+
                for(i=0; i<vnum; i++) {
                        if(v[i].w != 0.0f) {
                                v[i].x /= v[i].w;
index af7ea93..f9bc61c 100644 (file)
@@ -134,7 +134,7 @@ static void update(void)
 
        {
                int i, j;
-               float tsec = 0;//time_msec / 1000.0f;
+               float tsec = time_msec / 1000.0f;
                static float phase[] = {0.0, M_PI / 3.0, M_PI * 0.8};
                static float speed[] = {0.8, 1.4, 1.0};
                static float scale[][3] = {{1, 2, 0.8}, {0.5, 1.6, 0.6}, {1.5, 0.7, 0.5}};
@@ -186,6 +186,8 @@ static void draw(void)
 
        draw_mesh(&mmesh);
 
+       g3d_viewport(0, 0, fb_width, fb_height);
+
        swap_buffers(fb_pixels);
 }
 
index db5997a..12df420 100644 (file)
@@ -93,8 +93,9 @@ void POLYFILL(struct pvertex *pv, int nverts)
                if(pv[i].y > pv[botidx].y) botidx = i;
        }
 
-       left = alloca(pfill_fb.height * sizeof *left);
-       right = alloca(pfill_fb.height * sizeof *right);
+       /* +1 to avoid crashing due to off-by-one rounding errors in the rasterization */
+       left = alloca((pfill_fb.height + 1) * sizeof *left);
+       right = alloca((pfill_fb.height + 1) * sizeof *right);
 
        for(i=0; i<nverts; i++) {
                int next = NEXTIDX(i);
index 05744e8..09645aa 100644 (file)
@@ -30,7 +30,8 @@ int main(int argc, char **argv)
        xsz = fb_width * fbscale;
        ysz = fb_height * fbscale;
 
-       if(!(fb_pixels = malloc(fb_width * fb_height * fb_bpp / CHAR_BIT))) {
+       /* allocate 1 extra row as a guard band, until we fucking fix the rasterizer */
+       if(!(fb_pixels = malloc(fb_width * (fb_height + 1) * fb_bpp / CHAR_BIT))) {
                fprintf(stderr, "failed to allocate virtual framebuffer\n");
                return 1;
        }