From 139a46c56af04a0b8c2f06769ac77078f5581395 Mon Sep 17 00:00:00 2001 From: rodri Date: Sun, 11 Aug 2024 21:40:53 +0000 Subject: fix FPINVAL error. knob for fb clear color. general improvements. --- camera.c | 9 ++++++--- color.c | 7 +++++++ fb.c | 6 +++--- graphics.h | 4 +++- render.c | 7 ++++--- 5 files changed, 23 insertions(+), 10 deletions(-) diff --git a/camera.c b/camera.c index 8395c0e..e67601f 100644 --- a/camera.c +++ b/camera.c @@ -211,21 +211,24 @@ shootcamera(Camera *c, Shadertab *s) static Scene *skyboxscene; static Shadertab skyboxshader = { nil, skyboxvs, skyboxfs }; Model *mdl; + Framebufctl *fbctl; Renderjob *job; uvlong t0, t1; assert(c->view != nil && c->rctl != nil && c->scene != nil && s != nil); + fbctl = c->view->fbctl; + job = emalloc(sizeof *job); memset(job, 0, sizeof *job); - job->fb = c->view->fbctl->getbb(c->view->fbctl); + job->fb = fbctl->getbb(fbctl); job->camera = emalloc(sizeof *c); *job->camera = *c; job->scene = dupscene(c->scene); /* take a snapshot */ job->shaders = s; job->donec = chancreate(sizeof(void*), 0); - c->view->fbctl->reset(c->view->fbctl); + fbctl->reset(fbctl, c->clearcolor); t0 = nanosec(); sendp(c->rctl->c, job); recvp(job->donec); @@ -250,7 +253,7 @@ shootcamera(Camera *c, Shadertab *s) delscene(job->scene); } t1 = nanosec(); - c->view->fbctl->swap(c->view->fbctl); + fbctl->swap(fbctl); updatestats(c, t1-t0); updatetimes(c, job); diff --git a/color.c b/color.c index 6ba23e3..f38e66d 100644 --- a/color.c +++ b/color.c @@ -140,3 +140,10 @@ linear2srgb(Color c) c.b = _linear2srgb(c.b); return c; } + +ulong +rgba2xrgb(ulong c) +{ + return (c & 0xFF)<<24|(c>>8 & 0xFF)<<16| + (c>>16 & 0xFF)<<8|(c>>24 & 0xFF); +} diff --git a/fb.c b/fb.c index 6bd22e9..4b1f82e 100644 --- a/fb.c +++ b/fb.c @@ -222,16 +222,16 @@ resetAbuf(Abuf *buf) } static void -framebufctl_reset(Framebufctl *ctl) +framebufctl_reset(Framebufctl *ctl, ulong clr) { Framebuf *fb; /* address the back buffer—resetting the front buffer is VERBOTEN */ fb = ctl->getbb(ctl); resetAbuf(&fb->abuf); - memset(fb->nb, 0, Dx(fb->r)*Dy(fb->r)*4); + memsetl(fb->nb, 0, Dx(fb->r)*Dy(fb->r)); memsetf(fb->zb, Inf(-1), Dx(fb->r)*Dy(fb->r)); - memset(fb->cb, 0, Dx(fb->r)*Dy(fb->r)*4); + memsetl(fb->cb, rgba2xrgb(clr), Dx(fb->r)*Dy(fb->r)); } static Framebuf * diff --git a/graphics.h b/graphics.h index c9a7f67..e08e233 100644 --- a/graphics.h +++ b/graphics.h @@ -293,7 +293,7 @@ struct Framebufctl void (*upscalememdraw)(Framebufctl*, Memimage*, Point, Point); void (*drawnormals)(Framebufctl*, Image*); void (*swap)(Framebufctl*); - void (*reset)(Framebufctl*); + void (*reset)(Framebufctl*, ulong); Framebuf *(*getfb)(Framebufctl*); Framebuf *(*getbb)(Framebufctl*); }; @@ -325,6 +325,7 @@ struct Camera } clip; Matrix3 proj; /* VCS to clip space xform */ Projection projtype; + int clearcolor; int cullmode; int enableblend; int enabledepth; @@ -418,6 +419,7 @@ Memimage *dupmemimage(Memimage*); /* color */ Color srgb2linear(Color); Color linear2srgb(Color); +ulong rgba2xrgb(ulong); /* shadeop */ double sign(double); diff --git a/render.c b/render.c index 764dbca..50285cc 100644 --- a/render.c +++ b/render.c @@ -42,6 +42,9 @@ pixel(Framebuf *fb, Point p, Color c, int blend) if(blend){ dc = srgb2linear(ul2col(getpixel(fb, p))); c = lerp3(dc, c, c.a); /* SoverD */ +// c = addpt3(mulpt3(dc, 1), mulpt3(c, 1-c.a)); +// c = subpt3(Vec3(1,1,1), subpt3(dc, c)); +// c = subpt3(addpt3(dc, c), Vec3(1,1,1)); } putpixel(fb, p, col2ul(linear2srgb(c))); } @@ -87,8 +90,7 @@ pushtoAbuf(Framebuf *fb, Point p, Color c, float z) buf = &fb->abuf; stk = &buf->stk[p.y*Dx(fb->r) + p.x]; stk->items = erealloc(stk->items, ++stk->size*sizeof(*stk->items)); - -//fprint(2, "stk %#p items %#p size %lud (%d bytes)\n", stk, stk->items, stk->size, sizeof(*stk)); + memset(&stk->items[stk->size-1], 0, sizeof(*stk->items)); for(i = 0; i < stk->size; i++) if(z < stk->items[i].z) @@ -107,7 +109,6 @@ pushtoAbuf(Framebuf *fb, Point p, Color c, float z) buf->act = erealloc(buf->act, ++buf->nact*sizeof(*buf->act)); buf->act[buf->nact-1] = stk; qunlock(buf); -//fprint(2, "act %#p nact %lud (%d bytes)\n", buf->act, buf->nact, sizeof(*buf->act)); } } -- cgit v1.2.3