added page flipping/scrolling VBE calls
[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 <assert.h>
7 #include <conio.h>
8 #include "demo.h"
9 #include "keyb.h"
10 #include "mouse.h"
11 #include "timer.h"
12 #include "gfx.h"
13 #include "vmath.h"
14 #include "cfgopt.h"
15 #include "logger.h"
16 #include "tinyfps.h"
17
18 #undef NOKEYB
19
20 static int quit;
21 static int use_mouse;
22 static long fbsize;
23
24 static vec3_t pos = {0, 0, 0};
25 static quat_t rot = {0, 0, 0, 1};
26
27 int main(int argc, char **argv)
28 {
29         fbsize = fb_width * fb_height * fb_bpp / CHAR_BIT;
30
31         init_logger("demo.log");
32
33         init_timer(100);
34 #ifndef NOKEYB
35         kb_init(32);
36 #endif
37
38         if((use_mouse = have_mouse())) {
39                 printf("initializing mouse input\n");
40                 set_mouse_limits(0, 0, fb_width, fb_height);
41                 set_mouse(fb_width / 2, fb_height / 2);
42         }
43
44         if(!(fb_pixels = malloc(fbsize))) {
45                 fprintf(stderr, "failed to allocate backbuffer\n");
46                 return 1;
47         }
48
49         if(!(vmem_back = set_video_mode(fb_width, fb_height, fb_bpp))) {
50                 return 1;
51         }
52         if(!(vmem_front = page_flip(FLIP_NOW))) {
53                 /* page flipping not supported */
54                 vmem_front = vmem_back;
55         } else {
56                 assert(vmem_back != vmem_front);
57         }
58
59         if(demo_init(argc, argv) == -1) {
60                 set_text_mode();
61                 return 1;
62         }
63
64         reset_timer();
65
66         while(!quit) {
67 #ifndef NOKEYB
68                 int key;
69                 while((key = kb_getkey()) != -1) {
70                         demo_keyboard(key, 1);
71                 }
72 #else
73                 if(kbhit()) {
74                         demo_keyboard(getch(), 1);
75                 }
76 #endif
77                 if(quit) goto break_evloop;
78
79                 if(use_mouse) {
80                         mouse_bmask = read_mouse(&mouse_x, &mouse_y);
81                 }
82
83                 time_msec = get_msec();
84                 demo_draw();
85         }
86
87 break_evloop:
88         set_text_mode();
89         demo_cleanup();
90 #ifndef NOKEYB
91         kb_shutdown();
92 #endif
93         return 0;
94 }
95
96 void demo_quit(void)
97 {
98         quit = 1;
99 }
100
101 void swap_buffers(void *pixels)
102 {
103         if(pixels) {
104                 /* just memcpy to the front buffer */
105                 if(opt.vsync) {
106                         wait_vsync();
107                 }
108                 drawFps(pixels);
109                 memcpy(vmem_front, pixels, fbsize);
110
111         } else {
112                 /* attempt page flipping */
113                 void *next;
114
115                 drawFps(vmem_back);
116                 if((next = page_flip(opt.vsync ? FLIP_VBLANK_WAIT : FLIP_NOW))) {
117                         assert(next == vmem_back);
118                         vmem_back = vmem_front;
119                         vmem_front = next;
120                 } else {
121                         /* failed to page flip, assume we drew in the front buffer then
122                          * and just wait for vsync if necessary
123                          */
124                         if(opt.vsync) {
125                                 wait_vsync();
126                         }
127                 }
128         }
129 }