shithub: asif

Download patch

ref: b5baeb3dc3f2d6e45d0b2da3b2e82cad103c1789
parent: bbb8f4aee6098856e9171bbbd12cb5e424a8ca2e
author: qwx <qwx@sciops.net>
date: Thu Dec 16 22:45:43 EST 2021

add wip path(1)

--- /dev/null
+++ b/path/client.c
@@ -1,0 +1,108 @@
+#include <u.h>
+#include <libc.h>
+#include <thread.h>
+#include <draw.h>
+#include <mouse.h>
+#include <keyboard.h>
+#include <pool.h>
+#include "../asif.h"
+#include "dat.h"
+#include "fns.h"
+
+extern QLock drawlock;
+int	mouseinput(Node*, Mouse);
+int	keyinput(Rune);
+Node*	scrselect(Point);
+void	updatedrw(void);
+
+static Keyboardctl *kc;
+static Mousectl *mc;
+
+void
+evloop(void)
+{
+	Rune r;
+	Mouse m;
+	Node *n;
+
+	enum{
+		Aresize,
+		Amouse,
+		Akbd,
+		Aend,
+	};
+	Alt a[] = {
+		[Aresize] {mc->resizec, nil, CHANRCV},
+		[Amouse] {mc->c, &mc->Mouse, CHANRCV},
+		[Akbd] {kc->c, &r, CHANRCV},
+		[Aend] {nil, nil, CHANEND},
+	};
+	for(;;){
+		switch(alt(a)){
+		case Aresize:
+			if(getwindow(display, Refnone) < 0)
+				sysfatal("resize failed: %r");
+			resetdrw();
+			break;
+		case Amouse:
+			m = mc->Mouse;
+			if(m.buttons == 0)
+				break;
+			if((n = scrselect(m.xy)) != nil){
+				if(m.buttons & 4)
+					n->blocked ^= 1;
+				mouseinput(n, m);
+			}
+			updatedrw();
+			break;
+		case Akbd:
+			switch(r){
+			case Kdel: threadexitsall(nil);
+			}
+			keyinput(r);
+			break;
+		}
+	}
+}
+
+static void
+usage(void)
+{
+	fprint(2, "usage: %s [-s width[,height]]\n", argv0);
+	threadexits("usage");
+}
+
+void
+init(int argc, char **argv)
+{
+	char *s;
+
+	mapwidth = 64;
+	mapheight = 64;
+	ARGBEGIN{
+	case 's':
+		mapwidth = strtol(EARGF(usage()), &s, 0);
+		if(mapwidth <= 0)
+			usage();
+		if(*s != ','){
+			mapheight = mapwidth;
+			break;
+		}
+		mapheight = strtol(s+1, nil, 0);
+		if(mapheight <= 0)
+			usage();
+		break;
+	default: usage();
+	}ARGEND
+	//mainmem->flags |= POOL_PARANOIA | POOL_NOREUSE;
+	fmtinstall('P', Pfmt);
+	fmtinstall('R', Rfmt);
+	initfs();
+	initmap();
+	initgrid();
+	initdrw();
+	if((kc = initkeyboard(nil)) == nil)
+		sysfatal("initkeyboard: %r");
+	if((mc = initmouse(nil, screen)) == nil)
+		sysfatal("initmouse: %r");
+}
--- /dev/null
+++ b/path/dat.h
@@ -1,0 +1,13 @@
+typedef struct Vertex Vertex;
+typedef struct Node Node;
+
+struct Vertex{
+	int x;
+	int y;
+};
+struct Node{
+	int blocked;
+};
+extern Node *map;
+extern int mapwidth, mapheight;
+extern Node *selected;
--- /dev/null
+++ b/path/dijkstra.c
@@ -1,0 +1,28 @@
+#include <u.h>
+#include <libc.h>
+#include <thread.h>
+#include <draw.h>
+#include <mouse.h>
+#include <keyboard.h>
+#include "../asif.h"
+#include "dat.h"
+#include "fns.h"
+
+int
+mouseinput(Node *, Mouse)
+{
+	return 0;
+}
+
+int
+keyinput(Rune)
+{
+	return 0;
+}
+
+void
+threadmain(int argc, char **argv)
+{
+	init(argc, argv);
+	evloop();
+}
--- /dev/null
+++ b/path/drw.c
@@ -1,0 +1,145 @@
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+#include "../asif.h"
+#include "dat.h"
+#include "fns.h"
+
+QLock drawlock;
+Node *selected;
+
+typedef Vertex Point;
+
+enum{
+	Nodesz = 8,
+};
+enum{
+	Cbg,
+	Cgrid,
+	Copen,
+	Cclosed,
+	Cend,
+};
+static Image *col[Cend];
+static Point viewΔ;
+static Rectangle viewr, hudr;
+static Image *view;
+
+static Image *
+eallocimage(Rectangle r, int repl, ulong col)
+{
+	Image *i;
+
+	if((i = allocimage(display, r, screen->chan, repl, col)) == nil)
+		sysfatal("allocimage: %r");
+	return i;
+}
+
+Node *
+scrselect(Point p)
+{
+	p = subpt(addpt(subpt(p, screen->r.min), viewΔ), Pt(1,1));
+	if(!ptinrect(p, viewr)){
+		selected = nil;
+		return nil;
+	}
+	p = divpt(p, Nodesz);
+	p.x = MIN(p.x, mapwidth-1);
+	p.y = MIN(p.y, mapheight-1);
+	selected = map + p.y * mapwidth + p.x;
+	return selected;
+}
+
+static void
+flushdrw(void)
+{
+	draw(screen, screen->r, view, nil, viewΔ);
+	flushimage(display, 1);
+}
+
+static void
+drawhud(void)
+{
+	char s[64], *sp;
+	Node *n;
+
+	draw(screen, hudr, col[Cbg], nil, ZP);
+	sp = seprint(s, s+sizeof s, "map size: %R", viewr);
+	if((n = selected) != nil){
+		assert(n >= map && n < map + mapwidth * mapheight);
+		sp = seprint(sp, s+sizeof s, " selected: %P: %s",
+			Pt((n-map) % mapwidth, (n-map) / mapwidth),
+			n->blocked ? "blocked" : "");
+	}
+	USED(sp);
+	string(screen, addpt(screen->r.min, subpt(Pt(2, viewr.max.y+2), viewΔ)), col[Copen], ZP, font, s);
+}
+
+static void
+drawmap(void)
+{
+	Rectangle r;
+	Node *n;
+
+	draw(view, view->r, col[Copen], nil, ZP);
+	r = viewr;
+	while(r.min.x < viewr.max.x){
+		r.max.x = r.min.x;
+		line(view, r.min, r.max, 0, 0, 0, col[Cgrid], ZP);
+		r.min.x += Nodesz;
+	}
+	r = viewr;
+	while(r.min.y < viewr.max.y){
+		r.max.y = r.min.y;
+		line(view, r.min, r.max, 0, 0, 0, col[Cgrid], ZP);
+		r.min.y += Nodesz;
+	}
+	for(n=map; n<map+mapwidth*mapheight; n++)
+		if(n->blocked){
+			r.min.x = (n - map) % mapwidth * Nodesz + 1;
+			r.min.y = (n - map) / mapwidth * Nodesz + 1;
+			r.max = addpt(r.min, Pt(Nodesz-1, Nodesz-1));
+			draw(view, r, col[Cclosed], nil, ZP);
+		}
+}
+
+static void
+redraw(void)
+{
+	drawmap();
+}
+
+void
+updatedrw(void)
+{
+	qlock(&drawlock);
+	redraw();
+	qunlock(&drawlock);
+	drawhud();
+	flushdrw();
+}
+
+void
+resetdrw(void)
+{
+	viewr = Rpt(ZP, Pt(mapwidth*Nodesz+1, mapheight*Nodesz+1));
+	viewΔ = divpt(addpt(subpt(ZP, subpt(screen->r.max, screen->r.min)), viewr.max), 2);
+	hudr.min = addpt(screen->r.min, subpt(Pt(2, viewr.max.y+2), viewΔ));
+	hudr.max = addpt(hudr.min, Pt(viewr.max.x-2, font->height*3));
+	freeimage(view);
+	view = eallocimage(viewr, 0, DNofill);
+	draw(screen, screen->r, col[Cbg], nil, ZP);
+	updatedrw();
+}
+
+void
+initdrw(void)
+{
+	if(initdraw(nil, nil, "path") < 0)
+		sysfatal("initdraw: %r");
+	col[Cbg] = display->black;
+	col[Cgrid] = eallocimage(Rect(0,0,1,1), 1, 0x222222ff);
+	col[Copen] = eallocimage(Rect(0,0,1,1), 1, 0x777777ff);
+	col[Cclosed] = display->black;
+	resetdrw();
+}
--- /dev/null
+++ b/path/fns.h
@@ -1,0 +1,7 @@
+void	init(int, char**);
+void	evloop(void);
+void	initfs(void);
+void	initmap(void);
+void	initgrid(void);
+void	initdrw(void);
+void	resetdrw(void);
--- /dev/null
+++ b/path/fs.c
@@ -1,0 +1,10 @@
+#include <u.h>
+#include <libc.h>
+#include "../asif.h"
+#include "dat.h"
+#include "fns.h"
+
+void
+initfs(void)
+{
+}
--- /dev/null
+++ b/path/grid.c
@@ -1,0 +1,15 @@
+#include <u.h>
+#include <libc.h>
+#include "../asif.h"
+#include "dat.h"
+#include "fns.h"
+
+struct PNode{
+	Vertex;
+};
+
+void
+initgrid(void)
+{
+
+}
--- /dev/null
+++ b/path/map.c
@@ -1,0 +1,14 @@
+#include <u.h>
+#include <libc.h>
+#include "../asif.h"
+#include "dat.h"
+#include "fns.h"
+
+Node *map;
+int mapwidth, mapheight;
+
+void
+initmap(void)
+{
+	map = emalloc(mapwidth * mapheight * sizeof *map);
+}
--- /dev/null
+++ b/path/mkfile
@@ -1,0 +1,24 @@
+</$objtype/mkfile
+BIN=$home/bin/$objtype/path
+TARG=\
+	dijkstra\
+
+HFILES=../asif.h dat.h fns.h
+OFILES=\
+	../emalloc.$O\
+	client.$O\
+	drw.$O\
+	fs.$O\
+	grid.$O\
+	map.$O\
+
+</sys/src/cmd/mkmany
+
+$O.dijkstra: $OFILES dijkstra.$O ../pheap.$O
+
+dicks:V:
+	mkdir -p $BIN
+install:V:	dicks
+%.$O:	%.c
+	$CC -o $target $CFLAGS $stem.c
+CLEANFILES=`{echo ../*.[$OS]}