shithub: 3dee

Download patch

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;
 		}
-	}
 }
--