shithub: 3dee

Download patch

ref: 3e0fe77fe3832b4c4eb7abe9c16088d9ff08f7bc
parent: 0373255087377122eeb10e006ffb8aa1b57e611c
author: rgl <devnull@localhost>
date: Mon Feb 3 17:48:29 EST 2020

main: go back to channel-sync'd drawing.

--- a/main.c
+++ b/main.c
@@ -33,9 +33,10 @@
 char stats[Se][256];
 
 Mousectl *mctl;
+Channel *drawc;
 int kdown;
-double t0, Δt;
-RWLock worldlock;
+vlong t0, t;
+double Δt;
 Mesh model;
 char *mdlpath = "../threedee/mdl/rocket.obj";
 
@@ -119,7 +120,7 @@
 {
 	int i;
 
-	snprint(stats[Scamno], sizeof(stats[Scamno]), "CAM %d", maincam-cams+1);
+	snprint(stats[Scamno], sizeof(stats[Scamno]), "CAM %lld", maincam-cams+1);
 	snprint(stats[Sfov], sizeof(stats[Sfov]), "FOV %g°", maincam->fov);
 	snprint(stats[Scampos], sizeof(stats[Scampos]), "%V", maincam->p);
 	snprint(stats[Scambx], sizeof(stats[Scambx]), "bx %V", maincam->bx);
@@ -193,13 +194,11 @@
 }
 
 void
-scrsynproc(void *)
+drawproc(void *)
 {
-	threadsetname("scrsynproc");
+	threadsetname("drawproc");
 	for(;;){
-		rlock(&worldlock);
-		redraw();
-		runlock(&worldlock);
+		send(drawc, nil);
 		sleep(FPS2MS(60));
 	}
 }
@@ -224,15 +223,15 @@
 void
 mouse(void)
 {
-	if(mctl->buttons & 1)
+	if((mctl->buttons & 1) != 0)
 		fprint(2, "%v\n", fromviewport(maincam, mctl->xy));
-	if(mctl->buttons & 8){
+	if((mctl->buttons & 8) != 0){
 		maincam->fov -= 5;
 		if(maincam->fov < 1)
 			maincam->fov = 1;
 		reloadcamera(maincam);
 	}
-	if(mctl->buttons & 16){
+	if((mctl->buttons & 16) != 0){
 		maincam->fov += 5;
 		if(maincam->fov > 359)
 			maincam->fov = 359;
@@ -336,7 +335,7 @@
 void
 usage(void)
 {
-	fprint(2, "usage: %s\n", argv0);
+	fprint(2, "usage: %s [-l objmdl]\n", argv0);
 	exits("usage");
 }
 
@@ -370,27 +369,29 @@
 	maincam = &cams[0];
 	if((objmesh = objparse(mdlpath)) == nil)
 		sysfatal("objparse: %r");
+	drawc = chancreate(1, 0);
 	display->locking = 1;
 	unlockdisplay(display);
-	proccreate(scrsynproc, nil, mainstacksize);
+	proccreate(drawproc, nil, mainstacksize);
 	proccreate(kbdproc, nil, mainstacksize);
 	t0 = nsec();
 	for(;;){
-		enum {MOUSE, RESIZE};
+		enum {MOUSE, RESIZE, DRAW};
 		Alt a[] = {
 			{mctl->c, &mctl->Mouse, CHANRCV},
 			{mctl->resizec, nil, CHANRCV},
+			{drawc, nil, CHANRCV},
 			{nil, nil, CHANNOBLK}
 		};
-		wlock(&worldlock);
 		switch(alt(a)){
 		case MOUSE: mouse(); break;
 		case RESIZE: resize(); break;
+		case DRAW: redraw(); break;
 		}
-		Δt = (nsec()-t0)/1e9;
+		t = nsec();
+		Δt = (t-t0)/1e9;
 		handlekeys();
-		t0 += Δt*1e9;
-		wunlock(&worldlock);
+		t0 = t;
 		sleep(16);
 	}
 }