diff --git a/src/lephisto.c b/src/lephisto.c index 014ea41..8e3d481 100644 --- a/src/lephisto.c +++ b/src/lephisto.c @@ -66,9 +66,10 @@ #define LEPHISTO_INIT_DELAY 3000 /**< Minimum amount of time to wait with loading screen. */ -static int quit = 0; /**< For primary loop. */ -unsigned int time = 0; /**< USed to calculate FPS and movement, in pause.c */ -static char version[VERSION_LEN]; +static int quit = 0; /**< For primary loop. */ +static unsigned int time = 0; /**< Used to calculate FPS and movement, in pause.c */ +static char version[VERSION_LEN]; /**< Contains version. */ +static glTexture* loading; /**< Loading screen. */ /* Just some default crap. */ char* data = NULL; /**< Path to datafile. */ @@ -80,8 +81,11 @@ int indjoystick = -1; /**< Index of joystick to use, -1 is none. * char* namjoystick = NULL; /**< Name of joystick to use, NULL is none. */ /* Prototypes. */ +/* Loading. */ static void print_SDLversion(void); -static void load_screen(void); +static void loadscreen_load(void); +static void loadscreen_render(double done, const char* msg); +static void loadscreen_unload(void); static void load_all(void); static void unload_all(void); static void display_fps(const double dt); @@ -158,8 +162,14 @@ int main(int argc, char** argv) { SDL_Quit(); exit(EXIT_FAILURE); } + + gl_fontInit(NULL, NULL, FONT_SIZE); /* Initializes default font size. */ + gl_fontInit(&gl_smallFont, NULL, FONT_SIZE_SMALL); /* Small font. */ window_caption(); - load_screen(); + + /* Display the load screen. */ + loadscreen_load(); + loadscreen_render(0., "Initializing subsystems..."); time = SDL_GetTicks(); /* OpenAL sound. */ @@ -201,14 +211,15 @@ int main(int argc, char** argv) { ERR("Unable to init the Nebulae subsystem!"); /* Weirdness will accur. */ } - gl_fontInit(NULL, NULL, FONT_SIZE); /* Init default font size. */ - gl_fontInit(&gl_smallFont, NULL, FONT_SIZE_SMALL); /* Small font. */ gui_init(); /* Init the GUI crap. */ toolkit_init(); /* Init the toolkit. */ /* Data loading. */ load_all(); + /* Unload load screen. */ + loadscreen_unload(); + /* Start menu. */ menu_main(); @@ -261,13 +272,12 @@ int main(int argc, char** argv) { } /** - * @fn void load_scren(void) + * @fn void loadscreen_load(void) * * @brief Display a loading screen. */ -void load_screen(void) { +void loadscreen_load(void) { int i; - glTexture* tex; char file_path[PATH_MAX]; char** files; uint32_t nfiles; @@ -292,15 +302,65 @@ void load_screen(void) { /* Load the texture. */ snprintf(file_path, PATH_MAX, "../gfx/loading%03d.png", RNG(0, nload-1)); - tex = gl_newImage(file_path); + loading = gl_newImage(file_path); +} - /* Draw once, won't be redrawn. */ +/** + * @fn static void loadscreen_render(double done, const char* msg) + * + * @brief Render the load screen with message. + * @param done Amount done (1. == completed). + * @param msg Loading screen message. + */ +static void loadscreen_render(double done, const char* msg) { + double x, y, w, h, rh; + + /* Clear background. */ glClear(GL_COLOR_BUFFER_BIT); - gl_blitScale(tex, 0., 0., SCREEN_W, SCREEN_H, NULL); - SDL_GL_SwapBuffers(); + /* Draw loading screen image. */ + gl_blitScale(loading, 0., 0., SCREEN_W, SCREEN_H, NULL); + + /* Draw progress bar. */ + w = gl_screen.w * 0.4; + h = gl_screen.h * 0.02; + rh = h + gl_defFont.h + 4.; + x = -w/2.; + y = -h/2.; + /* BG. */ + ACOLOUR(cBlack, 0.7); + glBegin(GL_QUADS); + glVertex2d(x-2., y-2. + 0.); + glVertex2d(x-2., y+2. + rh); + glVertex2d(x-2. + w+4., y+2. + rh); + glVertex2d(x-2. + w+4., y-2. + 0.); + glEnd(); + /* FG. */ + ACOLOUR(cConsole, 0.7); + glBegin(GL_QUADS); + glVertex2d(x, y + 0.); + glVertex2d(x, y + h); + glVertex2d(x + done*w, y + h); + glVertex2d(x + done*w, y + 0.); + glEnd(); + + /* Draw text. */ + gl_print(&gl_defFont, x + gl_screen.w/2., y + gl_screen.h/2 + 2. + h, + &cConsole, msg); + + /* Flip buffers. */ + SDL_GL_SwapBuffers(); +} + +/** + * @fn static void loadscreen_unload(void) + * + * @brief Frees the loading screen. + */ +static void loadscreen_unload(void) { /* Free the textures. */ - gl_freeTexture(tex); + gl_freeTexture(loading); + loading = NULL; } /** @@ -308,16 +368,26 @@ void load_screen(void) { * * @brief Load all the data, makes main() simpler. */ +#define LOADING_STAGES 9. /**< Amount of loading stages. */ void load_all(void) { /* Ordering of these is very important as they are interdependent. */ + loadscreen_render(1./LOADING_STAGES, "Loading the pilot's food surplus..."); commodity_load(); + loadscreen_render(2./LOADING_STAGES, "Loading the powers that be..."); factions_load(); /* Dep for fleet, space, missions. */ + loadscreen_render(3./LOADING_STAGES, "Loading things to do..."); missions_load(); /* No dep. */ + loadscreen_render(4./LOADING_STAGES, "Loading firework displays..."); spfx_load(); + loadscreen_render(5./LOADING_STAGES, "Loading laser beams..."); outfit_load(); + loadscreen_render(6./LOADING_STAGES, "Loading floating homes..."); ships_load(); + loadscreen_render(7./LOADING_STAGES, "Loading rich snobs..."); fleet_load(); + loadscreen_render(8./LOADING_STAGES, "Loading the entire universe"); space_load(); + loadscreen_render(1./LOADING_STAGES, "Load Complete!!"); xmlCleanupParser(); /* Only needed to be run after all the loading is done. */ }