added serial spaceball support in the dos version. can be used for
[dosdemo] / src / demo.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <math.h>
5 #include <errno.h>
6 #include <limits.h>
7 #include "demo.h"
8 #include "screen.h"
9 #include "3dgfx.h"
10 #include "music.h"
11 #include "cfgopt.h"
12 #include "tinyfps.h"
13
14 int fb_width = 320;
15 int fb_height = 240;
16 int fb_bpp = 16;
17 uint16_t *fb_pixels, *vmem_back, *vmem_front;
18 unsigned long time_msec;
19 int mouse_x, mouse_y;
20 unsigned int mouse_bmask;
21
22 float sball_matrix[] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
23
24 static unsigned long nframes;
25
26 int demo_init(int argc, char **argv)
27 {
28         struct screen *scr;
29         char *env;
30
31         if(load_config("demo.cfg") == -1) {
32                 return -1;
33         }
34         if((env = getenv("START_SCR"))) {
35                 opt.start_scr = env;
36         }
37         if(parse_args(argc, argv) == -1) {
38                 return -1;
39         }
40
41         initFpsFonts();
42
43         if(g3d_init() == -1) {
44                 return -1;
45         }
46         g3d_framebuffer(fb_width, fb_height, fb_pixels);
47
48         if(opt.music) {
49                 if(music_open("data/test.mod") == -1) {
50                         return -1;
51                 }
52         }
53
54         if(scr_init() == -1) {
55                 return -1;
56         }
57         if(opt.start_scr) {
58                 scr = scr_lookup(opt.start_scr);
59         } else {
60                 scr = scr_screen(0);
61         }
62
63         if(!scr || scr_change(scr, 4000) == -1) {
64                 fprintf(stderr, "screen %s not found\n", opt.start_scr ? opt.start_scr : "0");
65                 return -1;
66         }
67
68         /* clear the framebuffer at least once */
69         memset(fb_pixels, 0, fb_width * fb_height * fb_bpp / CHAR_BIT);
70
71         if(opt.music) {
72                 music_play();
73         }
74         return 0;
75 }
76
77 void demo_cleanup(void)
78 {
79         if(opt.music) {
80                 music_close();
81         }
82         scr_shutdown();
83         g3d_destroy();
84
85         if(time_msec) {
86                 float fps = (float)nframes / ((float)time_msec / 1000.0f);
87                 printf("average framerate: %.1f\n", fps);
88         }
89 }
90
91 void demo_draw(void)
92 {
93         if(opt.music) {
94                 music_update();
95         }
96         scr_update();
97         scr_draw();
98
99         ++nframes;
100 }
101
102 void demo_keyboard(int key, int state)
103 {
104         if(state) {
105                 switch(key) {
106                 case 27:
107                         demo_quit();
108                         break;
109
110                 default:
111                         if(key >= '1' && key <= '1' + scr_num_screens()) {
112                                 int idx = key - '1';
113                                 printf("change screen %d\n", idx);
114                                 scr_change(scr_screen(idx), 4000);
115                         }
116                         break;
117                 }
118         }
119 }