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