X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Fsplash.cxx;h=f33baf3e10d6ab206d2f375ef6c2cab59be4a4ef;hb=1c3e2d4942fe74dac43f1f6af542f9de7d4825db;hp=f2be9494582caeb3c0be04fd76c3674556fe0534;hpb=f1b1077d930d542014baf54a328b7a233182647a;p=flightgear.git diff --git a/src/Main/splash.cxx b/src/Main/splash.cxx index f2be94945..f33baf3e1 100644 --- a/src/Main/splash.cxx +++ b/src/Main/splash.cxx @@ -30,140 +30,198 @@ # include #endif -#ifdef HAVE_WINDOWS_H +#ifdef HAVE_WINDOWS_H # include #endif -#include -#include - #include +#include +#include + +#include SG_GLU_H + #include +#include #include #include -#include +#include #include "globals.hxx" #include "fg_props.hxx" #include "splash.hxx" +#include "fg_os.hxx" +static const int fontsize = 19; +static const char fontname[] = "default.txf"; +static const char *progress_text = 0; -static GLuint splash_texid; -static GLubyte *splash_texbuf; + +static SGTexture splash; +static fntTexFont font; +static fntRenderer info; // Initialize the splash screen -void fgSplashInit ( void ) { - int width, height; +void fgSplashInit ( const char *splash_texture ) { + fgRequestRedraw(); SG_LOG( SG_GENERAL, SG_INFO, "Initializing splash screen" ); -#ifdef GL_VERSION_1_1 - xglGenTextures(1, &splash_texid); - xglBindTexture(GL_TEXTURE_2D, splash_texid); -#elif GL_EXT_texture_object - xglGenTexturesEXT(1, &splash_texid); - xglBindTextureEXT(GL_TEXTURE_2D, splash_texid); -#else -# error port me -#endif - xglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - xglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - xglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - xglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - // load in the texture data - int num = (int)(sg_random() * 4.0 + 1.0); - char num_str[256]; - sprintf(num_str, "%d", num); + SGPath fontpath; + char* envp = ::getenv("FG_FONTS"); + if (envp != NULL) { + fontpath.set(envp); + } else { + fontpath.set(globals->get_fg_root()); + fontpath.append("Fonts"); + } + SGPath path(fontpath); + path.append(fontname); + + if (!font.load((char *)path.c_str())) { + SG_LOG( SG_GENERAL, SG_ALERT, "Error loading font " << path.str() ); + return; + } - SGPath tpath( globals->get_fg_root() ); - tpath.append( "Textures/Splash" ); - tpath.concat( num_str ); - tpath.concat( ".rgb" ); + info.setFont(&font); + info.setPointSize(fontsize); - if ( (splash_texbuf = - read_rgb_texture(tpath.c_str(), &width, &height)) == NULL ) + if (!fgGetBool("/sim/startup/splash-screen")) + return; + + splash.bind(); + + SGPath tpath( globals->get_fg_root() ); + if (splash_texture == NULL || !strcmp(splash_texture, "")) { + // load in the texture data + int num = (int)(sg_random() * 5.0 + 1.0); + char num_str[5]; + snprintf(num_str, 4, "%d", num); + + tpath.append( "Textures/Splash" ); + tpath.concat( num_str ); + tpath.concat( ".rgb" ); + } else + tpath.append( splash_texture ); + + splash.read_rgb_texture(tpath.c_str()); + if (!splash.usable()) { - // Try compressed - SGPath fg_tpath = tpath; - fg_tpath.concat( ".gz" ); - if ( (splash_texbuf = - read_rgb_texture(fg_tpath.c_str(), &width, &height)) == NULL ) - { - SG_LOG( SG_GENERAL, SG_ALERT, - "Error in loading splash screen texture " << tpath.str() ); - exit(-1); - } - } - - xglTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, - GL_UNSIGNED_BYTE, (GLvoid *)(splash_texbuf) ); + // Try compressed + SGPath fg_tpath = tpath; + fg_tpath.concat( ".gz" ); + + splash.read_rgb_texture(fg_tpath.c_str()); + if ( !splash.usable() ) + { + SG_LOG( SG_GENERAL, SG_ALERT, + "Error in loading splash screen texture " << tpath.str() ); + exit(-1); + } + } + + splash.select(); } -// Update the splash screen with progress specified from 0.0 to 1.0 -void fgSplashUpdate ( double progress ) { - int xmin, ymin, xmax, ymax; - int xsize = 480; - int ysize = 380; +void fgSplashProgress ( const char *s ) +{ + progress_text = s; + fgRequestRedraw(); +} - if ( !fgGetInt("/sim/startup/xsize") - || !fgGetInt("/sim/startup/ysize") ) { - return; - } - xmin = (fgGetInt("/sim/startup/xsize") - xsize) / 2; - xmax = xmin + xsize; +// Update the splash screen with alpha specified from 0.0 to 1.0 +void fgSplashUpdate ( float alpha ) { + int screen_width = fgGetInt("/sim/startup/xsize", 0); + int screen_height = fgGetInt("/sim/startup/ysize", 0); - ymin = (fgGetInt("/sim/startup/ysize") - ysize) / 2; - ymax = ymin + ysize; + if (!screen_width || !screen_height) + return; - // first clear the screen; - xglClearColor(0.0, 0.0, 0.0, 1.0); - xglClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT ); + int size = screen_width < (screen_height - 5 * fontsize) + ? screen_width : screen_height - 5 * fontsize; + if (size > 512) + size = 512; - // now draw the logo - xglMatrixMode(GL_PROJECTION); - xglPushMatrix(); - xglLoadIdentity(); - gluOrtho2D(0, fgGetInt("/sim/startup/xsize"), - 0, fgGetInt("/sim/startup/ysize")); - xglMatrixMode(GL_MODELVIEW); - xglPushMatrix(); - xglLoadIdentity(); - - xglDisable(GL_DEPTH_TEST); - xglDisable(GL_LIGHTING); - xglEnable(GL_TEXTURE_2D); -#ifdef GL_VERSION_1_1 - xglBindTexture(GL_TEXTURE_2D, splash_texid); -#elif GL_EXT_texture_object - xglBindTextureEXT(GL_TEXTURE_2D, splash_texid); -#else -# error port me -#endif - xglTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); + int xmin, ymin, xmax, ymax; + xmin = (screen_width - size) / 2; + xmax = xmin + size; + + ymin = (screen_height - size) / 2; + ymax = ymin + size; + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluOrtho2D(0, screen_width, 0, screen_height); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + + // draw the background + glColor4f( 0.0, 0.0, 0.0, alpha ); + glBegin(GL_POLYGON); + glVertex2f(0.0, 0.0); + glVertex2f(screen_width, 0.0); + glVertex2f(screen_width, screen_height); + glVertex2f(0.0, screen_height); + glEnd(); - xglBegin(GL_POLYGON); - xglTexCoord2f(0.0, 0.0); glVertex2f(xmin, ymin); - xglTexCoord2f(1.0, 0.0); glVertex2f(xmax, ymin); - xglTexCoord2f(1.0, 1.0); glVertex2f(xmax, ymax); - xglTexCoord2f(0.0, 1.0); glVertex2f(xmin, ymax); - xglEnd(); + // now draw the logo + if (fgGetBool("/sim/startup/splash-screen", true)) { + glEnable(GL_TEXTURE_2D); + splash.bind(); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + + glColor4f( 1.0, 1.0, 1.0, alpha ); + glBegin(GL_POLYGON); + glTexCoord2f(0.0, 0.0); glVertex2f(xmin, ymin); + glTexCoord2f(1.0, 0.0); glVertex2f(xmax, ymin); + glTexCoord2f(1.0, 1.0); glVertex2f(xmax, ymax); + glTexCoord2f(0.0, 1.0); glVertex2f(xmin, ymax); + glEnd(); + } - xglutSwapBuffers(); + if (info.getFont() && progress_text && fgGetBool("/sim/startup/splash-progress", true)) { + glEnable(GL_ALPHA_TEST); + glEnable(GL_BLEND); + glAlphaFunc(GL_GREATER, 0.1f); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_CULL_FACE); + + float left, right, bot, top; + + info.begin(); + FGColor c(1.0, 0.9, 0.0); + c.merge(fgGetNode("/sim/gui/colors/splash")); + glColor4f(c.red(), c.green(), c.blue(), alpha); + + font.getBBox(progress_text, fontsize, 0, &left, &right, &bot, &top); + info.start2f((screen_width - right) / 2.0, 10.0 - bot); + info.puts(progress_text); + + const char *s = fgGetString("/sim/startup/splash-title", ""); + font.getBBox(s, fontsize, 0, &left, &right, &bot, &top); + info.start2f((screen_width - right) / 2.0, screen_height - top - bot - 10.0); + info.puts(s); + info.end(); + } - xglEnable(GL_DEPTH_TEST); - xglEnable(GL_LIGHTING); - xglDisable(GL_TEXTURE_2D); + glEnable(GL_DEPTH_TEST); + glEnable(GL_LIGHTING); + glDisable(GL_TEXTURE_2D); - xglMatrixMode(GL_PROJECTION); - xglPopMatrix(); - xglMatrixMode(GL_MODELVIEW); - xglPopMatrix(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); }