]> git.mxchange.org Git - flightgear.git/blob - src/Main/splash.cxx
c0bc348c949208d9639a1702584e4177fbb2a24d
[flightgear.git] / src / Main / splash.cxx
1 // splash.cxx -- draws the initial splash screen
2 //
3 // Written by Curtis Olson, started July 1998.  (With a little looking
4 // at Freidemann's panel code.) :-)
5 //
6 // Copyright (C) 1997  Michele F. America  - nomimarketing@mail.telepac.pt
7 //
8 // This program is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU General Public License as
10 // published by the Free Software Foundation; either version 2 of the
11 // License, or (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful, but
14 // WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 // General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 //
22 // $Id$
23
24
25 #ifdef HAVE_CONFIG_H
26 #  include <config.h>
27 #endif
28
29 #ifdef SG_MATH_EXCEPTION_CLASH
30 #  include <math.h>
31 #endif
32
33 #ifdef HAVE_WINDOWS_H
34 #  include <windows.h>
35 #endif
36
37 #include <string.h>
38
39 #include <plib/pu.h>
40 #include <simgear/compiler.h>
41
42 #include SG_GLU_H
43
44 #include <simgear/debug/logstream.hxx>
45 #include <simgear/screen/texture.hxx>
46 #include <simgear/math/sg_random.h>
47 #include <simgear/misc/sg_path.hxx>
48
49 #include "globals.hxx"
50 #include "fg_props.hxx"
51 #include "splash.hxx"
52 #include "fg_os.hxx"
53
54 static const int fontsize = 19;
55 static const char fontname[] = "default.txf";
56 static const char *progress_text = 0;
57
58
59 static SGTexture splash;
60 static fntTexFont font;
61 static fntRenderer info;
62
63
64 // Initialize the splash screen
65 void fgSplashInit ( const char *splash_texture ) {
66     fgRequestRedraw();
67
68     SG_LOG( SG_GENERAL, SG_INFO, "Initializing splash screen" );
69
70
71     SGPath fontpath;
72     char* envp = ::getenv("FG_FONTS");
73     if (envp != NULL) {
74         fontpath.set(envp);
75     } else {
76         fontpath.set(globals->get_fg_root());
77         fontpath.append("Fonts");
78     }
79     SGPath path(fontpath);
80     path.append(fontname);
81
82     if (!font.load((char *)path.c_str())) {
83         SG_LOG( SG_GENERAL, SG_ALERT, "Error loading font " << path.str() );
84         return;
85     }
86
87     info.setFont(&font);
88     info.setPointSize(fontsize);
89
90     if (!fgGetBool("/sim/startup/splash-screen"))
91         return;
92
93     splash.bind();
94
95     SGPath tpath( globals->get_fg_root() );
96     if (splash_texture == NULL || !strcmp(splash_texture, "")) {
97         // load in the texture data
98         int num = (int)(sg_random() * 5.0 + 1.0);
99         char num_str[5];
100         snprintf(num_str, 4, "%d", num);
101
102         tpath.append( "Textures/Splash" );
103         tpath.concat( num_str );
104         tpath.concat( ".rgb" );
105     } else
106         tpath.append( splash_texture );
107
108     splash.read_rgb_texture(tpath.c_str());
109     if (!splash.usable())
110     {
111         // Try compressed
112         SGPath fg_tpath = tpath;
113         fg_tpath.concat( ".gz" );
114
115         splash.read_rgb_texture(fg_tpath.c_str());
116         if ( !splash.usable() )
117         {
118             SG_LOG( SG_GENERAL, SG_ALERT,
119                     "Error in loading splash screen texture " << tpath.str() );
120             exit(-1);
121         }
122     }
123
124     splash.select();
125 }
126
127
128 void fgSplashProgress ( const char *s )
129 {
130     progress_text = s;
131     fgRequestRedraw();
132 }
133
134
135 // Update the splash screen with alpha specified from 0.0 to 1.0
136 void fgSplashUpdate ( float alpha ) {
137     int screen_width = fgGetInt("/sim/startup/xsize", 0);
138     int screen_height = fgGetInt("/sim/startup/ysize", 0);
139
140     if (!screen_width || !screen_height)
141         return;
142
143     int size = screen_width < (screen_height - 5 * fontsize)
144             ? screen_width : screen_height - 5 * fontsize;
145     if (size > 512)
146         size = 512;
147
148     int xmin, ymin, xmax, ymax;
149     xmin = (screen_width - size) / 2;
150     xmax = xmin + size;
151
152     ymin = (screen_height - size) / 2;
153     ymax = ymin + size;
154
155     glMatrixMode(GL_PROJECTION);
156     glPushMatrix();
157     glLoadIdentity();
158     gluOrtho2D(0, screen_width, 0, screen_height);
159     glMatrixMode(GL_MODELVIEW);
160     glPushMatrix();
161     glLoadIdentity();
162
163     glDisable(GL_DEPTH_TEST);
164     glDisable(GL_LIGHTING);
165
166     // draw the background
167     glColor4f( 0.0, 0.0, 0.0, alpha );
168     glBegin(GL_POLYGON);
169     glVertex2f(0.0, 0.0);
170     glVertex2f(screen_width, 0.0);
171     glVertex2f(screen_width, screen_height);
172     glVertex2f(0.0, screen_height);
173     glEnd();
174
175     // now draw the logo
176     if (fgGetBool("/sim/startup/splash-screen", true)) {
177         glEnable(GL_TEXTURE_2D);
178         splash.bind();
179         glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
180
181         glColor4f( 1.0, 1.0, 1.0, alpha );
182         glBegin(GL_POLYGON);
183         glTexCoord2f(0.0, 0.0); glVertex2f(xmin, ymin);
184         glTexCoord2f(1.0, 0.0); glVertex2f(xmax, ymin);
185         glTexCoord2f(1.0, 1.0); glVertex2f(xmax, ymax);
186         glTexCoord2f(0.0, 1.0); glVertex2f(xmin, ymax);
187         glEnd();
188     }
189
190     if (info.getFont() && progress_text && fgGetBool("/sim/startup/splash-progress", true)) {
191         glEnable(GL_ALPHA_TEST);
192         glEnable(GL_BLEND);
193         glAlphaFunc(GL_GREATER, 0.1f);
194         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
195         glDisable(GL_CULL_FACE);
196
197         float left, right, bot, top;
198
199         info.begin();
200         glColor4f(1.0, 0.9, 0.0, alpha);
201         font.getBBox(progress_text, fontsize, 0, &left, &right, &bot, &top);
202         info.start2f((screen_width - right) / 2.0, 10.0 - bot);
203         info.puts(progress_text);
204
205         const char *s = fgGetString("/sim/startup/splash-title", "");
206         font.getBBox(s, fontsize, 0, &left, &right, &bot, &top);
207         info.start2f((screen_width - right) / 2.0, screen_height - top - bot - 10.0);
208         info.puts(s);
209         info.end();
210     }
211
212     glEnable(GL_DEPTH_TEST);
213     glEnable(GL_LIGHTING);
214     glDisable(GL_TEXTURE_2D);
215
216     glMatrixMode(GL_PROJECTION);
217     glPopMatrix();
218     glMatrixMode(GL_MODELVIEW);
219     glPopMatrix();
220 }
221
222