// // Written and (c) Torsten Dreyer - Torsten(at)t3r_dot_de // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as // published by the Free Software Foundation; either version 2 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // #ifdef HAVE_CONFIG_H # include #endif #include #include #include #ifdef HAVE_WINDOWS_H #include #endif #if defined (SG_MAC) #include #include #elif defined (_GLES2) #include #include "GLES_utils.hxx" #else #include // Must be included before #include #include #endif #include #include "FGGLApplication.hxx" using namespace std; FGGLApplication *FGGLApplication::application = NULL; FGGLApplication::FGGLApplication (const char * a_name, int argc, char **argv) : gameMode (false), name (a_name) { if (application != NULL ) { cerr << "Only one instance of FGGLApplication allowed!" << endl; throw exception (); } application = this; #ifdef _GLES2 GLES_utils::instance ().init ("FG Panel"); #else glutInit (&argc, argv); glutInitContextVersion (2, 1); glutInitContextFlags (GLUT_CORE_PROFILE); #endif } FGGLApplication::~FGGLApplication () { #ifndef _GLES2 if (gameMode) { glutLeaveGameMode (); } #endif } void FGGLApplication::DisplayCallback () { if (application) { application->Display (); } } void FGGLApplication::IdleCallback () { if (application) { application->Idle (); } } void FGGLApplication::KeyCallback (const unsigned char key, const int x, const int y) { if (application) { application->Key (key, x, y); } } void FGGLApplication::ReshapeCallback (const int width, const int height) { if (application) { application->Reshape (width, height); } } void FGGLApplication::Run (const int glutMode, const bool gameMode, int width, int height, const int bpp) { #ifndef _GLES2 glutInitDisplayMode (glutMode); if (gameMode) { width = glutGet (GLUT_SCREEN_WIDTH); height = glutGet (GLUT_SCREEN_HEIGHT); char game_mode_str[20]; snprintf (game_mode_str, 20, "%dx%d:%d", width, height, bpp); glutGameModeString (game_mode_str); glutEnterGameMode (); this->gameMode = gameMode; } else { if (width == -1) { width = glutGet (GLUT_SCREEN_WIDTH); } if (height == -1) { height = glutGet (GLUT_SCREEN_HEIGHT); } glutInitDisplayMode (glutMode); glutInitWindowSize(width, height); windowId = glutCreateWindow (name); } const GLenum GLEW_err (glewInit ()); if (GLEW_OK != GLEW_err) { cerr << "Unable to initialize GLEW " << glewGetErrorString (GLEW_err) << endl; exit (1); } if (!GLEW_VERSION_2_1) { // check that the machine supports the 2.1 API. cerr << "GLEW version 2.1 not supported : " << glewGetString (GLEW_VERSION) << endl; exit (1); } cout << "OpenGL version = " << glGetString (GL_VERSION) << endl; #endif Init (); #ifdef _GLES2 GLES_utils::instance ().register_keyboard_func (FGGLApplication::KeyCallback); GLES_utils::instance ().register_idle_func (FGGLApplication::IdleCallback); GLES_utils::instance ().register_display_func (FGGLApplication::DisplayCallback); GLES_utils::instance ().register_reshape_func (FGGLApplication::ReshapeCallback); GLES_utils::instance ().main_loop (); #else glutKeyboardFunc (FGGLApplication::KeyCallback); glutIdleFunc (FGGLApplication::IdleCallback); glutDisplayFunc (FGGLApplication::DisplayCallback); glutReshapeFunc (FGGLApplication::ReshapeCallback); glutMainLoop (); #endif }