added summerhack
[summerhack] / src / sumhack.cpp
1 #include <iostream>
2 #include <vector>
3 #include <cstdio>
4 #include <cstdlib>
5 #include "3dengfx/3dengfx.hpp"
6 #include "dsys/demosys.hpp"
7 #include "common/err_msg.h"
8 #include "parts/parts.hpp"
9 #include "events.hpp"
10 #include "sdlvf/sdlvf.h"
11
12 using namespace std;
13
14 bool init();
15 void update_gfx();
16 void clean_up();
17
18 dsys::Part *part;
19 ntimer timer;
20
21 std::vector<dsys::Part*> parts;
22
23 bool music = true;
24
25 bool render = false;
26 int render_fps = 25;
27 const char *render_path = "frames";
28
29 unsigned long avg_frame_time, frame_count;
30
31 const char *help_str = "command line options\n------------------\n"
32         "-r\trender the demo as a sequence of targa files\n"
33         "-f <fps>\tset the rendering framerate for -r above\n"
34         "-p <path>\tset the directory in which to render the sequnce for -r.\n"
35         "-m\ttoggle music.\n"
36         "-h\tthis help screen\n\n";
37
38 int main(int argc, char **argv) {
39         for(int i=1; i<argc; i++) {
40                 if(argv[i][0] == '-' && argv[i][2] == 0) {
41                         switch(argv[i][1]) {
42                         case 'r':
43                                 render = true;
44                                 break;
45
46                         case 'f':
47                                 if(isdigit(argv[++i][0])) {
48                                         render_fps = atoi(argv[i]);
49                                 } else {
50                                         cerr << "invalid argument -f " << argv[i] << endl;
51                                         return EXIT_FAILURE;
52                                 }
53                                 break;
54
55                         case 'p':
56                                 render_path = argv[++i];
57                                 break;
58
59                         case 'm':
60                                 music = !music;
61                                 break;
62
63                         default:
64                                 cout << help_str;
65                                 return argv[i][1] == 'h' ? 0 : EXIT_FAILURE;
66                         }
67                 } else {
68                         cout << help_str;
69                         return EXIT_FAILURE;
70                 }
71         }
72
73         if(!init()) {
74                 return EXIT_FAILURE;
75         }
76
77         return fxwt::main_loop();
78 }
79
80 bool init() {
81         GraphicsInitParameters *gip;
82         if(!(gip = load_graphics_context_config("3dengfx.conf"))) {
83                 return false;
84         }
85
86         if(!create_graphics_context(*gip)) {
87                 return false;
88         }
89
90         if(gip->fullscreen) {
91                 SDL_ShowCursor(0);
92         }
93
94         fxwt::set_window_title("The Lab Demos :: Summer Hack");
95         fxwt::set_display_handler(update_gfx);
96         fxwt::set_idle_handler(update_gfx);
97         fxwt::set_keyboard_handler(key_handler);
98         fxwt::set_motion_handler(motion_handler);
99         fxwt::set_button_handler(bn_handler);
100         atexit(clean_up);
101
102         //dsys::init();
103
104         // show loading screen
105         dsys::overlay(get_texture("data/img/loading.jpg"), Vector2(0, 0), Vector2(1, 1), 1.0);
106         flip();
107
108         // check if we have all the textures we need
109         FILE *fp = fopen("data/tex_list", "r");
110         if(!fp) {
111                 error("couldn't find texture list, run this only from its directory");
112                 return false;
113         }
114
115         char tex_name[512];
116         while(fgets(tex_name, 512, fp)) {
117                 char *last_char = tex_name + strlen(tex_name) - 1;
118                 if(*last_char == '\n') {
119                         *last_char = 0;
120                 }
121                 if(!get_texture(tex_name)) {
122                         error("failed to load texture: \"%s\"", tex_name);
123                         return false;
124                 }
125         }
126         fclose(fp);
127         
128         set_scene_data_path("data/img");
129
130         INIT_PARTS();
131
132         for(size_t i=0; i<parts.size(); i++) {
133                 add_part(parts[i]);
134         }
135
136         if(!render) {
137                 dsys::start_demo();
138         } else {
139                 dsys::render_demo(render_fps, render_path);
140         }
141
142         if(music) {
143                 sdlvf_init("data/music/red_herring.ogg");
144         }
145         
146         timer_reset(&timer);
147         timer_start(&timer);
148         
149         return true;
150 }
151
152 void clean_up() {
153         unsigned long time = timer_getmsec(&timer);
154         
155         if(music) {
156                 sdlvf_done();
157         }
158
159         SDL_ShowCursor(1);
160
161         for(size_t i=0; i<parts.size(); i++) {
162                 delete parts[i];
163         }
164         destroy_graphics_context();
165
166         if(frame_count) {
167                 avg_frame_time /= frame_count;
168                 printf("average frame time: %lu msec, average fps: %.2f\n", avg_frame_time, 1000.0 / avg_frame_time);
169         }
170
171         time /= 1000;
172         cout << "ran for ";
173         if(time < 60) {
174                 cout << time << " seconds\n";
175         } else {
176                 cout << time / 60 << ":" << time - (time / 60) * 60 << "\n";
177         }
178 }
179
180 void update_gfx() {
181         unsigned long frame_start = timer_getmsec(&timer);
182         
183         if(music) {
184                 int sdlvf_err;
185                 if((sdlvf_err = sdlvf_check()) != SDLVF_PLAYING) {
186                         fprintf(stderr, "quit: %s", sdlvf_strerror(sdlvf_err));
187                         exit(0);
188                 }
189         }
190         
191         if(dsys::update_graphics() == -1) {
192                 exit(0);
193         }
194
195         avg_frame_time += timer_getmsec(&timer) - frame_start;
196         frame_count++;
197 }