BSP tree test
[dosrtxon] / src / dos / main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <math.h>
4 #include <string.h>
5 #include <limits.h>
6 #include <conio.h>
7 #include "demo.h"
8 #include "keyb.h"
9 #include "mouse.h"
10 #include "timer.h"
11 #include "gfx.h"
12 #include "vmath.h"
13 #include "cfgopt.h"
14 #include "logger.h"
15 #include "tinyfps.h"
16
17 #undef NOKEYB
18
19 static int quit;
20 static int use_mouse;
21 static long fbsize;
22
23 static vec3_t pos = {0, 0, 0};
24 static quat_t rot = {0, 0, 0, 1};
25
26 int main(int argc, char **argv)
27 {
28         fbsize = fb_width * fb_height * fb_bpp / CHAR_BIT;
29
30         init_logger("demo.log");
31
32         init_timer(100);
33 #ifndef NOKEYB
34         kb_init(32);
35 #endif
36
37         if((use_mouse = have_mouse())) {
38                 printf("initializing mouse input\n");
39                 set_mouse_limits(0, 0, fb_width, fb_height);
40                 set_mouse(fb_width / 2, fb_height / 2);
41         }
42
43         if(!(fb_pixels = malloc(fbsize))) {
44                 fprintf(stderr, "failed to allocate backbuffer\n");
45                 return 1;
46         }
47
48         if(!(vmem_front = set_video_mode(fb_width, fb_height, fb_bpp))) {
49                 return 1;
50         }
51         /* TODO implement multiple video memory pages for flipping */
52         vmem_back = vmem_front;
53
54         if(demo_init(argc, argv) == -1) {
55                 set_text_mode();
56                 return 1;
57         }
58
59         reset_timer();
60
61         while(!quit) {
62 #ifndef NOKEYB
63                 int key;
64                 while((key = kb_getkey()) != -1) {
65                         demo_keyboard(key, 1);
66                 }
67 #else
68                 if(kbhit()) {
69                         demo_keyboard(getch(), 1);
70                 }
71 #endif
72                 if(quit) goto break_evloop;
73
74                 if(use_mouse) {
75                         mouse_bmask = read_mouse(&mouse_x, &mouse_y);
76                 }
77
78                 time_msec = get_msec();
79                 demo_draw();
80         }
81
82 break_evloop:
83         set_text_mode();
84         demo_cleanup();
85 #ifndef NOKEYB
86         kb_shutdown();
87 #endif
88         return 0;
89 }
90
91 void demo_quit(void)
92 {
93         quit = 1;
94 }
95
96 void swap_buffers(void *pixels)
97 {
98         /* TODO implement page flipping */
99         if(pixels) {
100                 if(opt.vsync) {
101                         wait_vsync();
102                 }
103                 drawFps(pixels);
104                 memcpy(vmem_front, pixels, fbsize);
105         } else {
106                 drawFps(vmem_back);
107
108                 if(opt.vsync) {
109                         wait_vsync();
110                 }
111         }
112 }