minor gitignore additions
[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                 fxwt::show_cursor(false);
92         }
93
94         fxwt::set_window_title("The Lab Demos :: Summer Hack (rebuild)");
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         glClear(GL_COLOR_BUFFER_BIT);
106         dsys::overlay(get_texture("data/img/loading.jpg"), Vector2(0, 0), Vector2(1, 1), 1.0);
107         flip();
108
109         // check if we have all the textures we need
110         FILE *fp = fopen("data/tex_list", "r");
111         if(!fp) {
112                 error("couldn't find texture list, run this only from its directory");
113                 return false;
114         }
115
116         char tex_name[512];
117         while(fgets(tex_name, 512, fp)) {
118                 char *last_char = tex_name + strlen(tex_name) - 1;
119                 if(*last_char == '\n') {
120                         *last_char = 0;
121                 }
122                 if(!get_texture(tex_name)) {
123                         error("failed to load texture: \"%s\"", tex_name);
124                         return false;
125                 }
126         }
127         fclose(fp);
128         
129         set_scene_data_path("data/img");
130
131         INIT_PARTS();
132
133         for(size_t i=0; i<parts.size(); i++) {
134                 add_part(parts[i]);
135         }
136
137         if(!render) {
138                 dsys::start_demo();
139         } else {
140                 dsys::render_demo(render_fps, render_path);
141         }
142
143         if(music) {
144                 sdlvf_init("data/music/red_herring.ogg");
145         }
146         
147         timer_reset(&timer);
148         timer_start(&timer);
149
150         return true;
151 }
152
153 void clean_up() {
154         unsigned long time = timer_getmsec(&timer);
155
156         if(music) {
157                 sdlvf_done();
158         }
159
160         fxwt::show_cursor(true);
161
162         for(size_t i=0; i<parts.size(); i++) {
163                 delete parts[i];
164         }
165         destroy_graphics_context();
166
167         if(frame_count) {
168                 avg_frame_time /= frame_count;
169                 printf("average frame time: %lu msec, average fps: %.2f\n", avg_frame_time, 1000.0 / avg_frame_time);
170         }
171
172         time /= 1000;
173         cout << "ran for ";
174         if(time < 60) {
175                 cout << time << " seconds\n";
176         } else {
177                 cout << time / 60 << ":" << time - (time / 60) * 60 << "\n";
178         }
179 }
180
181 void update_gfx() {
182         unsigned long frame_start = timer_getmsec(&timer);
183         
184         if(music) {
185                 int sdlvf_err;
186                 if((sdlvf_err = sdlvf_check()) != SDLVF_PLAYING) {
187                         fprintf(stderr, "quit: %s", sdlvf_strerror(sdlvf_err));
188                         exit(0);
189                 }
190         }
191         
192         if(dsys::update_graphics() == -1) {
193                 exit(0);
194         }
195
196         avg_frame_time += timer_getmsec(&timer) - frame_start;
197         frame_count++;
198 }