summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2024-08-11 21:40:53 +0000
committerrodri <rgl@antares-labs.eu>2024-08-11 21:40:53 +0000
commit139a46c56af04a0b8c2f06769ac77078f5581395 (patch)
tree25b0ba14e35d62b061975e97b5445529cace0137
parentd3b48593b0fee862ea60687336031fd9374ab667 (diff)
downloadlibgraphics-139a46c56af04a0b8c2f06769ac77078f5581395.tar.gz
libgraphics-139a46c56af04a0b8c2f06769ac77078f5581395.tar.bz2
libgraphics-139a46c56af04a0b8c2f06769ac77078f5581395.zip
fix FPINVAL error. knob for fb clear color. general improvements.
-rw-r--r--camera.c9
-rw-r--r--color.c7
-rw-r--r--fb.c6
-rw-r--r--graphics.h4
-rw-r--r--render.c7
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));
}
}