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