1e88b5cb9ff887a190f2a0c5940b55f388c69b45
[vrlugburz] / tools / dunger / src / level.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <GL/gl.h>
5 #include "level.h"
6
7 extern int view_width, view_height;
8 extern float view_panx, view_pany, view_zoom;
9
10 extern int mousex, mousey, splitx;
11
12 static int cellsz;
13 static struct cell *selcell;
14
15
16 struct level *create_level(int xsz, int ysz)
17 {
18         struct level *lvl;
19
20         if(!(lvl = malloc(sizeof *lvl))) {
21                 return 0;
22         }
23         if(!(lvl->cells = calloc(xsz * ysz, sizeof *lvl->cells))) {
24                 free(lvl);
25                 return 0;
26         }
27         lvl->width = xsz;
28         lvl->height = ysz;
29         return lvl;
30 }
31
32 void free_level(struct level *lvl)
33 {
34         if(!lvl) return;
35         free(lvl->cells);
36         free(lvl);
37 }
38
39 void cell_to_pos(struct level *lvl, int cx, int cy, float *px, float *py)
40 {
41         if(px) *px = (cx - lvl->width / 2.0f) * cellsz - view_panx + view_width / 2.0f;
42         if(py) *py = (cy - lvl->height / 2.0f) * cellsz - view_pany + view_height / 2.0f;
43 }
44
45 struct cell *pos_to_cell(struct level *lvl, float px, float py, int *cx, int *cy)
46 {
47         int col, row;
48
49         col = (px + view_panx - view_width / 2.0f) / cellsz + lvl->width / 2.0f;
50         row = (py + view_pany - view_height / 2.0f) / cellsz + lvl->height / 2.0f;
51
52         if(cx) *cx = col;
53         if(cy) *cy = row;
54
55         if(col >= 0 && col < lvl->width && row >= 0 && row < lvl->height) {
56                 return lvl->cells + row * lvl->width + col;
57         }
58         return 0;
59 }
60
61 #define LTHICK  0.5f
62 static void draw_cell(struct level *lvl, struct cell *cell)
63 {
64         int cidx, row, col;
65         float x, y, hsz;
66         static const float colors[][3] = {{0, 0, 0}, {0.6, 0.6, 0.6}, {0.4, 0.2, 0.1}};
67
68         hsz = cellsz * 0.5f;
69
70         cidx = cell - lvl->cells;
71         row = cidx / lvl->width;
72         col = cidx % lvl->width;
73
74         cell_to_pos(lvl, col, row, &x, &y);
75         /*printf("c->p: %d,%d -> %f,%f\n", col, row, x, y);
76         pos_to_cell(lvl, x, y, &col, &row);
77         printf("p->c: %f,%f -> %d,%d\n", x, y, col, row);*/
78
79         if(selcell == cell) {
80                 glColor3f(0.4, 1.0f, 0.4);
81         } else {
82                 glColor3f(0.5f, 0.5f, 0.5f);
83         }
84         glVertex2f(x - hsz, y - hsz);
85         glVertex2f(x + hsz, y - hsz);
86         glVertex2f(x + hsz, y + hsz);
87         glVertex2f(x - hsz, y + hsz);
88
89         x += LTHICK / 2.0f;
90         y += LTHICK / 2.0f;
91         hsz -= LTHICK * 2.0f;
92
93         glColor3fv(colors[cell->type]);
94         glVertex2f(x - hsz, y - hsz);
95         glVertex2f(x + hsz, y - hsz);
96         glVertex2f(x + hsz, y + hsz);
97         glVertex2f(x - hsz, y + hsz);
98 }
99
100 void draw_level(struct level *lvl)
101 {
102         int i, j;
103         float xsz, ysz, hsz;
104         struct cell *cell;
105
106         xsz = view_zoom * view_width / lvl->width;
107         ysz = view_zoom * view_height / lvl->height;
108         cellsz = xsz > ysz ? ysz : xsz;
109         hsz = cellsz / 2.0f;
110
111         selcell = pos_to_cell(lvl, mousex + hsz - splitx, view_height - mousey + hsz, 0, 0);
112
113         glBegin(GL_QUADS);
114         cell = lvl->cells;
115         for(i=0; i<lvl->height; i++) {
116                 for(j=0; j<lvl->width; j++) {
117                         draw_cell(lvl, cell++);
118                 }
119         }
120         glEnd();
121 }