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