X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=erebus2020;a=blobdiff_plain;f=liberebus%2Fsrc%2Ferebus.c;h=dbc253bee2003dcb6643d82348a133d57e49403d;hp=32af87be9a749f512208a3143f48cb905610c87a;hb=d4eaf9f47882dc99d6523b8464dcaa1cc2789f26;hpb=2b43da6b56bd4b56bb3652612b4767a35c631394 diff --git a/liberebus/src/erebus.c b/liberebus/src/erebus.c index 32af87b..dbc253b 100644 --- a/liberebus/src/erebus.c +++ b/liberebus/src/erebus.c @@ -10,9 +10,8 @@ struct render_job { }; struct erb_rend { - int fb_width, fb_height, fb_npix; + int fb_width, fb_height, fb_size; float *fb_pixels; - int *fb_nsamples; }; static void proc_render_job(void *cls); @@ -49,36 +48,25 @@ void erb_destroy(struct erb_rend *erb) int erb_allocframe(struct erb_rend *erb, int width, int height) { float *newfb; - int *newns; - int npix; + int sz; if(width == erb->fb_width && height == erb->fb_height) { return 0; } - npix = width * height; - - if(!(newfb = malloc(npix * 3 * sizeof *erb->fb_pixels))) { - goto err; - } - if(!(newns = malloc(npix * sizeof *erb->fb_nsamples))) { - free(newfb); - goto err; + sz = width * height * 4 * sizeof *erb->fb_pixels; + if(!(newfb = malloc(sz))) { + fprintf(stderr, "erb_allocframe: failed to allocate %dx%d framebuffer\n", width, height); + return -1; } free(erb->fb_pixels); - free(erb->fb_nsamples); erb->fb_pixels = newfb; - erb->fb_nsamples = newns; erb->fb_width = width; erb->fb_height = height; - erb->fb_npix = npix; + erb->fb_size = sz; return 0; - -err: - fprintf(stderr, "erb_allocframe: failed to allocate %dx%d framebuffer\n", width, height); - return -1; } float *erb_getframe(struct erb_rend *erb) @@ -88,28 +76,24 @@ float *erb_getframe(struct erb_rend *erb) void erb_begin(struct erb_rend *erb) { - memset(erb->fb_pixels, 0, erb->fb_npix * 3 * sizeof *erb->fb_pixels); - memset(erb->fb_nsamples, 0, erb->fb_npix * sizeof *erb->fb_nsamples); + memset(erb->fb_pixels, 0, erb->fb_size); } float *erb_end(struct erb_rend *erb) { - int i, n; + int i, npix = erb->fb_width * erb->fb_height; float s; float *pptr = erb->fb_pixels; - int *nptr = erb->fb_nsamples; - for(i=0; ifb_npix; i++) { - n = *nptr; - if(n > 1) { - s = 1.0f / n; + for(i=0; i 1) { + s = 1.0f / pptr[3]; *pptr++ *= s; *pptr++ *= s; *pptr++ *= s; - *nptr++ = 1; + *pptr++ = 1.0f; } else { - pptr += 3; - nptr++; + pptr += 4; } } @@ -163,20 +147,19 @@ static void proc_render_job(void *cls) struct erb_rend *erb; struct render_job *job = cls; float *fbptr; - int *nsptr; struct erb_ray ray; erb = job->erb; fboffs = job->y * erb->fb_width + job->x; - fbptr = erb->fb_pixels + fboffs * 3; - nsptr = erb->fb_nsamples + fboffs; + fbptr = erb->fb_pixels + fboffs * 4; for(i=0; iheight; i++) { for(j=0; jwidth; j++) { - erb_primary_ray(erb, &ray, *nsptr++); + erb_primary_ray(erb, &ray, (int)fbptr[3]); erb_sample_ray(erb, &ray, fbptr); - fbptr += 3; + fbptr += 4; } + fbptr += (erb->fb_width - job->width) * 4; } free_job(job); }