00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "OpenFlipper/Core/Core.hh"
00038
00039
00040 #include <qapplication.h>
00041 #include <qgl.h>
00042
00043
00044 #include <iostream>
00045 #include <fstream>
00046 #include <csignal>
00047 #include <cstdlib>
00048
00049 #include "OpenFlipper/common/GlobalOptions.hh"
00050
00051 #include <OpenFlipper/SimpleOpt/SimpleOpt.h>
00052
00053 #if ( defined(WIN32) || defined(ARCH_DARWIN) )
00054 #define NO_EXECINFO
00055 #endif
00056
00057 #ifndef NO_EXECINFO
00058 #include <execinfo.h>
00059 #endif
00060
00061 #ifdef USE_OPENMP
00062 #include <omp.h>
00063 #endif
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 enum {OPT_HELP , OPT_STEREO, OPT_BATCH ,OPT_CONSOLE_LOG , OPT_DEBUGGING, OPT_FULLSCREEN,
00116 OPT_HIDDDEN_LOGGER , OPT_NOSPLASH ,OPT_HIDDDEN_TOOLBOX , OPT_LOAD_POLYMESHES,
00117 OPT_REMOTE};
00118
00119 CSimpleOpt::SOption g_rgOptions[] = {
00120 { OPT_DEBUGGING , (char*) "--debug" , SO_NONE },
00121 { OPT_HELP , (char*) "-?" , SO_NONE },
00122 { OPT_HELP , (char*) "--help" , SO_NONE },
00123 { OPT_HELP , (char*) "-h" , SO_NONE },
00124 { OPT_STEREO , (char*) "--disable-stereo" , SO_NONE },
00125 { OPT_BATCH , (char*) "-b" , SO_NONE },
00126 { OPT_CONSOLE_LOG , (char*) "-c" , SO_NONE },
00127 { OPT_CONSOLE_LOG , (char*) "--log-to-console" , SO_NONE },
00128 { OPT_FULLSCREEN , (char*) "-f" , SO_NONE },
00129 { OPT_HIDDDEN_LOGGER , (char*) "-l" , SO_NONE },
00130 { OPT_NOSPLASH , (char*) "--no-splash" , SO_NONE },
00131 { OPT_HIDDDEN_TOOLBOX , (char*) "-t" , SO_NONE },
00132 { OPT_LOAD_POLYMESHES , (char*) "-p" , SO_NONE },
00133 { OPT_REMOTE , (char*) "--remote-control" , SO_NONE },
00134 SO_END_OF_OPTIONS
00135 };
00136
00137 void showHelp() {
00138 std::cerr << "OpenFlipper [Options] <filenames> " << std::endl << std::endl;;
00139 std::cerr << "Possible Options : " << std::endl;
00140 std::cerr << std::endl;
00141
00142 std::cerr << "Load/Save Options:" << std::endl;
00143 std::cerr << " -p \t: Open files as PolyMeshes" << std::endl;
00144 std::cerr << std::endl;
00145
00146 std::cerr << "Gui Options:" << std::endl;
00147 std::cerr << " -f \t\t: Start Fullscreen" << std::endl;
00148 std::cerr << " -l \t\t: Start with hidden logger" << std::endl;
00149 std::cerr << " -t \t\t: Start with hidden Toolbox" << std::endl;
00150 std::cerr << " --no-splash \t: Disable splash screen" << std::endl;
00151
00152 std::cerr << " --disable-stereo \t: Disable Stereo Mode" << std::endl;
00153 std::cerr << std::endl;
00154
00155 std::cerr << "Log options:" << std::endl;
00156 std::cerr << " --log-to-console ( -c ) \t: Write logger window contents to console" << std::endl;
00157 std::cerr << std::endl;
00158
00159 std::cerr << "Other options:" << std::endl;
00160 std::cerr << " -b \t: Batch mode, you have to provide a script for execution" << std::endl;
00161 std::cerr << " --remote-control \t: Batch mode accepting remote connections" << std::endl;
00162
00163 std::cerr << std::endl;
00164
00165
00166 std::cerr << " -h \t: This help" << std::endl;
00167 }
00168
00169
00170 #ifndef NO_EXECINFO
00171 void backtrace()
00172 {
00173 void *addresses[10];
00174 char **strings;
00175
00176 int size = backtrace(addresses, 10);
00177 strings = backtrace_symbols(addresses, size);
00178 std::cerr << "Stack frames: " << size << std::endl;
00179 for(int i = 0; i < size; i++)
00180 std::cerr << i << ": " << strings[i] << std::endl;
00181 free(strings);
00182 }
00183 #endif
00184
00185 void segfaultHandling (int) {
00186
00187
00188 std::signal(SIGSEGV, SIG_DFL);
00189
00190
00191 std::cerr << "\n" << std::endl;
00192 std::cerr << "\n" << std::endl;
00193 std::cerr << "\33[31m" << "=====================================================" << std::endl;
00194 std::cerr << "\33[31m" << "OpenFlipper or one of its plugins caused a Segfault." << std::endl;
00195 std::cerr << "\33[31m" << "This should not happen,... Sorry :-(" << std::endl;
00196 std::cerr << "\33[31m" << "=====================================================" << std::endl;
00197 std::cerr << "\n" << std::endl;
00198 #ifndef NO_EXECINFO
00199 std::cerr << "\33[0m" << "Trying a backtrace to show what happened last: " << std::endl;
00200 backtrace();
00201
00202 std::cerr << "\n" << std::endl;
00203 std::cerr << "Backtrace completed, trying to abort now ..." << std::endl;
00204
00205 #endif
00206
00207 std::abort();
00208 }
00209
00210 bool openPolyMeshes = false;
00211 bool remoteControl = false;
00212
00213 bool parseCommandLineOptions(CSimpleOpt& args){
00214
00215
00216 while (args.Next()) {
00217
00218 if (args.LastError() == SO_SUCCESS) {
00219
00220 switch (args.OptionId() ) {
00221 case OPT_BATCH:
00222 OpenFlipper::Options::nogui(true);
00223 break;
00224 case OPT_CONSOLE_LOG:
00225 OpenFlipper::Options::logToConsole(true);
00226 break;
00227 case OPT_DEBUGGING:
00228 OpenFlipper::Options::debug(true);
00229 break;
00230 case OPT_STEREO:
00231 OpenFlipper::Options::stereo(false);
00232 break;
00233 case OPT_HIDDDEN_TOOLBOX:
00234 OpenFlipper::Options::hideToolbox(true);
00235 break;
00236 case OPT_HIDDDEN_LOGGER:
00237 OpenFlipper::Options::loggerState(OpenFlipper::Options::Hidden);
00238 break;
00239 case OPT_FULLSCREEN:
00240 OpenFlipper::Options::fullScreen(true);
00241 break;
00242 case OPT_LOAD_POLYMESHES:
00243 openPolyMeshes = true;
00244 break;
00245 case OPT_NOSPLASH:
00246 OpenFlipperSettings().setValue("Core/Gui/splash",false);
00247 break;
00248 case OPT_REMOTE:
00249 OpenFlipper::Options::remoteControl(true);
00250 break;
00251 case OPT_HELP:
00252 showHelp();
00253 return 0;
00254 }
00255 } else {
00256 std::cerr << "Invalid argument: " << args.OptionText() << std::endl;
00257 showHelp();
00258 return false;
00259 }
00260 }
00261 return true;
00262 }
00263
00264 int main(int argc, char **argv)
00265 {
00266
00267
00268 for (int i = 0; i < argc; i++) {
00269 if(strlen(argv[i]) > 4) {
00270 if( ( (argv[i])[0] == '-' ) &&
00271 ( (argv[i])[1] == 'p' ) &&
00272 ( (argv[i])[2] == 's' ) &&
00273 ( (argv[i])[3] == 'n' ) ) {
00274 argc--;
00275 argv[i] = (char *)"";
00276 }
00277 }
00278 }
00279
00280 OpenFlipper::Options::argc(&argc);
00281 OpenFlipper::Options::argv(&argv);
00282
00283 CSimpleOpt argBatch(argc, argv, g_rgOptions);
00284
00285
00286 while (argBatch.Next())
00287 if (argBatch.OptionId() == OPT_BATCH ){
00288 OpenFlipper::Options::nogui(true);
00289 break;
00290 }
00291
00292 CSimpleOpt args(argc, argv, g_rgOptions);
00293
00294
00295
00296
00297 std::signal(SIGSEGV, segfaultHandling);
00298
00299
00300 OpenFlipper::Options::windowTitle("OpenFlipper v" + OpenFlipper::Options::coreVersion());
00301
00302 if ( !OpenFlipper::Options::nogui() ) {
00303
00304
00305 QApplication::setColorSpec( QApplication::CustomColor );
00306 QApplication app(argc,argv);
00307
00308 if ( !QGLFormat::hasOpenGL() ) {
00309 std::cerr << "This system has no OpenGL support.\n";
00310 return -1;
00311 }
00312
00313 glutInit(&argc,argv);
00314
00315
00316 Core * w = new Core( );
00317
00318 if ( !parseCommandLineOptions(args) ) {
00319 delete w;
00320 return 1;
00321 }
00322
00323 QString tLang = OpenFlipper::Options::translation();
00324
00325 if (tLang == "locale")
00326 tLang = QLocale::system().name();
00327
00328
00329 QTranslator qtTranslator;
00330
00331
00332
00333
00334 qtTranslator.load("qt_" + tLang, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
00335
00336
00337 app.installTranslator(&qtTranslator);
00338
00339
00340 QString translationDir = OpenFlipper::Options::translationsDirStr() + QDir::separator();
00341
00342
00343
00344 QDir dir(translationDir);
00345 dir.setFilter(QDir::Files);
00346
00347 QFileInfoList list = dir.entryInfoList();
00348
00349 for (int i = 0; i < list.size(); ++i) {
00350 QFileInfo fileInfo = list.at(i);
00351
00352 if ( fileInfo.baseName().contains(tLang) ){
00353 QTranslator* myAppTranslator = new QTranslator();
00354
00355 if ( myAppTranslator->load( fileInfo.filePath() ) ){
00356
00357
00358 app.installTranslator(myAppTranslator);
00359 } else {
00360 delete myAppTranslator;
00361 }
00362 }
00363 }
00364
00365
00366 w->init();
00367
00368 GLenum err = glewInit();
00369 if (GLEW_OK != err)
00370 {
00371
00372 fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
00373 }
00374
00375
00376 for ( int i = 0 ; i < args.FileCount(); ++i )
00377 w->commandLineOpen(args.File(i), openPolyMeshes);
00378
00379 return app.exec();
00380
00381 } else {
00382
00383 QCoreApplication app(argc,argv);
00384
00385
00386 Core * w = new Core( );
00387
00388 if ( !parseCommandLineOptions(args) ) {
00389 delete w;
00390 return 1;
00391 }
00392
00393
00394 w->init();
00395
00396 for ( int i = 0 ; i < args.FileCount(); ++i )
00397 w->commandLineScript(args.File(i));
00398
00399 return app.exec();
00400 }
00401
00402 return 0;
00403 }