extern int view_width, view_height;
extern float view_panx, view_pany, view_zoom;
+extern int mousex, mousey, splitx;
+
+static int cellsz;
+static struct cell *selcell;
+
struct level *create_level(int xsz, int ysz)
{
free(lvl);
}
+void cell_to_pos(struct level *lvl, int cx, int cy, float *px, float *py)
+{
+ if(px) *px = (cx - lvl->width / 2.0f) * cellsz - view_panx + view_width / 2.0f;
+ if(py) *py = (cy - lvl->height / 2.0f) * cellsz - view_pany + view_height / 2.0f;
+}
+
+struct cell *pos_to_cell(struct level *lvl, float px, float py, int *cx, int *cy)
+{
+ int col, row;
+
+ col = (px + view_panx - view_width / 2.0f) / cellsz + lvl->width / 2.0f;
+ row = (py + view_pany - view_height / 2.0f) / cellsz + lvl->height / 2.0f;
+
+ if(cx) *cx = col;
+ if(cy) *cy = row;
+
+ if(col >= 0 && col < lvl->width && row >= 0 && row < lvl->height) {
+ return lvl->cells + row * lvl->width + col;
+ }
+ return 0;
+}
+
#define LTHICK 0.5f
static void draw_cell(struct level *lvl, struct cell *cell)
{
int cidx, row, col;
- float x, y, xsz, ysz, sz;
+ float x, y, hsz;
static const float colors[][3] = {{0, 0, 0}, {0.6, 0.6, 0.6}, {0.4, 0.2, 0.1}};
- xsz = view_zoom * view_width / lvl->width;
- ysz = view_zoom * view_height / lvl->height;
- sz = xsz > ysz ? ysz : xsz;
+ hsz = cellsz * 0.5f;
cidx = cell - lvl->cells;
row = cidx / lvl->width;
col = cidx % lvl->width;
- x = col * sz - view_panx;
- y = row * sz - view_pany;
+ cell_to_pos(lvl, col, row, &x, &y);
+ /*printf("c->p: %d,%d -> %f,%f\n", col, row, x, y);
+ pos_to_cell(lvl, x, y, &col, &row);
+ printf("p->c: %f,%f -> %d,%d\n", x, y, col, row);*/
- glColor3f(1, 1, 1);
- glVertex2f(x, y);
- glVertex2f(x + sz, y);
- glVertex2f(x + sz, y + sz);
- glVertex2f(x, y + sz);
+ if(selcell == cell) {
+ glColor3f(0.4, 1.0f, 0.4);
+ } else {
+ glColor3f(0.5f, 0.5f, 0.5f);
+ }
+ glVertex2f(x - hsz, y - hsz);
+ glVertex2f(x + hsz, y - hsz);
+ glVertex2f(x + hsz, y + hsz);
+ glVertex2f(x - hsz, y + hsz);
- x += LTHICK;
- y += LTHICK;
- sz -= LTHICK * 2.0f;
+ x += LTHICK / 2.0f;
+ y += LTHICK / 2.0f;
+ hsz -= LTHICK * 2.0f;
glColor3fv(colors[cell->type]);
- glVertex2f(x, y);
- glVertex2f(x + sz, y);
- glVertex2f(x + sz, y + sz);
- glVertex2f(x, y + sz);
+ glVertex2f(x - hsz, y - hsz);
+ glVertex2f(x + hsz, y - hsz);
+ glVertex2f(x + hsz, y + hsz);
+ glVertex2f(x - hsz, y + hsz);
}
void draw_level(struct level *lvl)
{
int i, j;
+ float xsz, ysz, hsz;
struct cell *cell;
+ xsz = view_zoom * view_width / lvl->width;
+ ysz = view_zoom * view_height / lvl->height;
+ cellsz = xsz > ysz ? ysz : xsz;
+ hsz = cellsz / 2.0f;
+
+ selcell = pos_to_cell(lvl, mousex + hsz - splitx, view_height - mousey + hsz, 0, 0);
+
glBegin(GL_QUADS);
cell = lvl->cells;
for(i=0; i<lvl->height; i++) {
float view_panx, view_pany, view_zoom = 1.0f;
static int bnstate[8];
-static int mousex, mousey, clickx, clicky;
+int mousex, mousey, clickx, clicky;
static float uiscale = 1.0f;
#define UISPLIT 150
-static int splitx;
+int splitx;
#define FONTSZ 16
static struct dtx_font *uifont;
{
glutInit(&argc, argv);
glutInitWindowSize(1280, 800);
- glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
+ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_MULTISAMPLE);
glutCreateWindow("dunger");
win_width = glutGet(GLUT_WINDOW_WIDTH);
{
utk_widget *win;
+ glEnable(GL_MULTISAMPLE);
+
glClearColor(0.15, 0.15, 0.15, 1);
if(!(uifont = dtx_open_font("uifont.ttf", 0))) {