24 void reshape(int x, int y);
25 void keyb(unsigned char key, int x, int y);
26 void keyb_up(unsigned char key, int x, int y);
27 void mouse(int bn, int st, int x, int y);
28 void motion(int x, int y);
30 int win_width, win_height;
34 unsigned int fb[FB_W * FB_H];
36 int mouse_x, mouse_y, mwarp, mbstate[3];
37 int hfilt = VOX_LINEAR, cfilt = VOX_LINEAR;
40 int32_t pos[2], theta, phi;
45 #define COLOR_HORIZON 0xcc77ff
46 #define COLOR_ZENITH 0x5588cc
49 int main(int argc, char **argv)
51 glutInit(&argc, argv);
52 glutInitWindowSize(1280, 960);
53 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
54 glutCreateWindow("voxel landscape test");
56 glutDisplayFunc(display);
58 glutReshapeFunc(reshape);
59 glutKeyboardFunc(keyb);
60 glutKeyboardUpFunc(keyb_up);
62 glutMotionFunc(motion);
81 if(!(vox = vox_open("data/height.png", "data/color.png"))) {
84 vox_framebuf(vox, FB_W, FB_H, fb);
85 vox_proj(vox, 140, 45, 1, 300);
86 vox_fog(vox, 260, COLOR_HORIZON);
87 vox_filter(vox, hfilt, cfilt);
89 glfb_setup(FB_W, FB_H, GLFB_RGBA32, FB_W * 4);
98 #define WALK_SPEED 0x40000
99 #define TURN_SPEED 0x100
103 int32_t fwd[2], right[2];
105 if(input & INP_LTURN) theta += TURN_SPEED;
106 if(input & INP_RTURN) theta -= TURN_SPEED;
108 fwd[0] = -SIN(theta);
113 if(input & INP_FWD) {
117 if(input & INP_BACK) {
121 if(input & INP_RIGHT) {
125 if(input & INP_LEFT) {
130 vox_view(vox, pos[0], pos[1], -30, theta, phi);
138 vox_sky_grad(vox, COLOR_HORIZON, COLOR_ZENITH);
144 assert(glGetError() == GL_NO_ERROR);
148 glutWarpPointer(win_width / 2, win_height / 2);
157 void reshape(int x, int y)
159 glViewport(0, 0, x, y);
165 void keyb(unsigned char key, int x, int y)
192 printf("filtering: height(%s) color(%s)\n", hfilt ? "linear" : "nearest",
193 cfilt ? "linear" : "nearest");
194 vox_filter(vox, hfilt, cfilt);
199 vox_filter(vox, hfilt, cfilt);
200 printf("filtering: height(%s) color(%s)\n", hfilt ? "linear" : "nearest",
201 cfilt ? "linear" : "nearest");
209 void keyb_up(unsigned char key, int x, int y)
236 void mouse(int bn, int st, int x, int y)
238 int bidx = bn - GLUT_LEFT_BUTTON;
241 mbstate[bidx] = st == GLUT_DOWN;
246 if(st == GLUT_DOWN) {
247 glutSetCursor(GLUT_CURSOR_NONE);
249 glutSetCursor(GLUT_CURSOR_LEFT_ARROW);
253 void motion(int x, int y)
255 int dx = x - mouse_x;
256 int dy = y - mouse_y;
264 if(!(dx | dy)) return;
269 if(phi < -0x18000) phi = -0x18000;
270 if(phi > 0x18000) phi = 0x18000;