ref: 0c2dfb69ce90eded24c97c2a1412cb4ac1352e28
parent: 7f1a4f11ee44e38ed09a56a934881b6a547145cb
author: rodri <rgl@antares-labs.eu>
date: Wed Jun 18 20:31:21 EDT 2025
med,solar,vis: pull the Alt out of the main loop vis: add an A-buffer sort of visualizer (it only shows how many fragments there are on every pixel by mapping them to a grey shade.)
--- a/med.c
+++ b/med.c
@@ -825,18 +825,17 @@
proccreate(renderproc, nil, mainstacksize);
proccreate(drawproc, nil, mainstacksize);
- for(;;){
- enum {MOUSE, RESIZE, KEY};
- Alt a[] = {
- {mctl->c, &mctl->Mouse, CHANRCV},
- {mctl->resizec, nil, CHANRCV},
- {keyc, nil, CHANRCV},
- {nil, nil, CHANEND}
- };
+ enum {MOUSE, RESIZE, KEY};
+ Alt a[] = {
+ {mctl->c, &mctl->Mouse, CHANRCV},
+ {mctl->resizec, nil, CHANRCV},
+ {keyc, nil, CHANRCV},
+ {nil, nil, CHANEND}
+ };
+ for(;;)
switch(alt(a)){
case MOUSE: mouse(); break;
case RESIZE: resize(); break;
case KEY: handlekeys(); break;
}
- }
}
--- a/solar.c
+++ b/solar.c
@@ -982,18 +982,17 @@
proccreate(renderproc, nil, mainstacksize);
proccreate(drawproc, nil, mainstacksize);
- for(;;){
- enum {MOUSE, RESIZE, KEY};
- Alt a[] = {
- {mctl->c, &mctl->Mouse, CHANRCV},
- {mctl->resizec, nil, CHANRCV},
- {keyc, nil, CHANRCV},
- {nil, nil, CHANEND}
- };
+ enum {MOUSE, RESIZE, KEY};
+ Alt a[] = {
+ {mctl->c, &mctl->Mouse, CHANRCV},
+ {mctl->resizec, nil, CHANRCV},
+ {keyc, nil, CHANRCV},
+ {nil, nil, CHANEND}
+ };
+ for(;;)
switch(alt(a)){
case MOUSE: mouse(); break;
case RESIZE: resize(); break;
case KEY: handlekeys(); break;
}
- }
}
--- a/vis.c
+++ b/vis.c
@@ -141,6 +141,55 @@
}
void
+viewabuffer(void)
+{
+ Viewport *v;
+ Framebuf *fb;
+ Abuf *abuf;
+ Astk *astk;
+ Memimage *ri;
+ Point p;
+ int c, pfd[2], cpid;
+
+ v = maincam->view;
+ qlock(v->fbctl);
+ fb = v->getfb(v);
+ abuf = &fb->abuf;
+ if(abuf->stk == nil){
+ qunlock(v->fbctl);
+ return;
+ }
+ ri = eallocmemimage(fb->r, GREY8);
+ for(p.y = 0; p.y < Dy(fb->r); p.y++)
+ for(p.x = 0; p.x < Dx(fb->r); p.x++){
+ astk = &abuf->stk[p.y*Dx(fb->r) + p.x];
+ c = min(max(astk->size*20, 0), 0xFF);
+ *byteaddr(ri, p) = c;
+ }
+ if(pipe(pfd) < 0)
+ sysfatal("pipe: %r");
+ switch(cpid = fork()){
+ case -1:
+ sysfatal("fork: %r");
+ case 0:
+ close(pfd[1]);
+ dup(pfd[0], 0);
+ close(pfd[0]);
+ execl("/bin/page", "page", "-w", nil);
+ sysfatal("execl: %r");
+ default:
+ close(pfd[0]);
+ if(writememimage(pfd[1], ri) < 0)
+ sysfatal("writememimage: %r");
+ close(pfd[1]);
+ freememimage(ri);
+ if(waitpid() != cpid)
+ sysfatal("child ran away");
+ }
+ qunlock(v->fbctl);
+}
+
+void
updatebbox(Entity *e)
{
static int inited;
@@ -355,6 +404,8 @@
TGLBLEND,
TGLDEPTH,
TGLABUFF,
+ SP5,
+ VIEWABUF,
};
static char *items[] = {
[MOVELIGHT] "move light",
@@ -374,7 +425,9 @@
"",
[TGLBLEND] "toggle blending",
[TGLDEPTH] "toggle depth testing",
- [TGLABUFF] "toggle the A-buffer",
+ [TGLABUFF] "toggle the a-buffer",
+ "",
+ [VIEWABUF] "view a-buffer",
nil,
};
static Menu menu = { .item = items };
@@ -444,6 +497,9 @@
case TGLABUFF:
maincam->rendopts ^= ROAbuff;
break;
+ case VIEWABUF:
+ viewabuffer();
+ break;
}
unlockdisplay(display);
nbsend(drawc, nil);
@@ -822,18 +878,17 @@
proccreate(renderproc, nil, mainstacksize);
proccreate(drawproc, nil, mainstacksize);
- for(;;){
- enum {MOUSE, RESIZE, KEY};
- Alt a[] = {
- {mctl->c, &mctl->Mouse, CHANRCV},
- {mctl->resizec, nil, CHANRCV},
- {keyc, nil, CHANRCV},
- {nil, nil, CHANEND}
- };
+ enum {MOUSE, RESIZE, KEY};
+ Alt a[] = {
+ {mctl->c, &mctl->Mouse, CHANRCV},
+ {mctl->resizec, nil, CHANRCV},
+ {keyc, nil, CHANRCV},
+ {nil, nil, CHANEND}
+ };
+ for(;;)
switch(alt(a)){
case MOUSE: mouse(); break;
case RESIZE: resize(); break;
case KEY: handlekeys(); break;
}
- }
}
--
⑨