Main Page | Namespace List | Class Hierarchy | Compound List | File List | Compound Members | File Members

main.cpp

Go to the documentation of this file.
00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <ctype.h>
00004 #include <string.h>
00005                                                                                    
00006 #ifdef WIN32
00007 #  include <windows.h>
00008 #else
00009 #  include <unistd.h>
00010 #endif
00011 #include <math.h>
00012                                                                                    
00013 #ifdef FREEGLUT_IS_PRESENT
00014 #  include <GL/freeglut.h>
00015 #else
00016 #  ifdef __APPLE__
00017 #    include <GLUT/glut.h>
00018 #  else
00019 #    include <GL/glut.h>
00020 #  endif
00021 #endif
00022 
00023 #include <signal.h>
00024 #include <GL/gl.h>
00025 #include <GL/glut.h>
00026 #include <GL/glu.h>
00027 #include <plib/ssg.h>
00028 
00029 #include <plib/pu.h>
00030 
00031 #include "common_gui_funcs.h"
00032 #include "core.h"
00033 
00034 #include "configuration.h"
00035 #include "userData.h"
00036 #include "core.h"
00037 
00038 #define str(s) #s
00039 
00040 // the graphic scene, to be given to a number of sub-objects
00041 ssgRoot* scene = NULL;
00042  
00043 //sceneManager* sman = NULL
00044  
00045 int display_width;
00046 int display_height;
00047 
00048 int game_state;
00049 
00050 puMenuBar* main_menu = NULL;
00051 bool in_game_menu    = false;
00052 
00053 puGroup* total_menu = NULL;
00054 puGroup* overlay_menu = NULL;
00055 
00056 configuration* config = NULL;
00057 userData* loc_player = NULL;
00058 GameCore* loc_core = NULL;
00059 
00060 sgVec3* cam_target      = NULL;
00061 float   view_distance   = 10.0f;
00062 float   view_x_angle    = 0.0f;
00063 float   view_z_angle    = 10.0f;
00064 static sgVec2  nmouse;
00065 int win_handle = -1;
00066 
00067 enum {
00068   MOVE_CAM,
00069   IN_GAME
00070 };
00071  
00072 int input_mode          = IN_GAME;
00073 
00074 void get_camera_data(int i) {
00075   sgVec3* d;
00076   d = config->get_campos(i);
00077   view_distance = *d[0];
00078   view_x_angle = *d[1];
00079   view_z_angle = *d[2];
00080 }
00081 
00082 void update_motion ()
00083 {
00084 }
00085  
00086 void mouse_motionfn (int x, int y) {
00087   nmouse[0] = ((double)x / display_width ) - 0.5f;
00088   nmouse[1] = ((double)y / display_height ) - 0.5f;
00089 }
00090 
00091 void keyfn ( unsigned char k, int, int )
00092 {
00093   if (puKeyboard(k + PU_KEY_GLUT_SPECIAL_OFFSET, PU_DOWN )) // some ui element took it
00094     return;
00095 
00096   int modifier = glutGetModifiers();
00097 
00098   switch(k) {
00099     case 27:
00100       fprintf(stderr, "ESC key pressed\n");
00101       break;
00102                                                                                    
00103     case GLUT_KEY_F1:
00104       if (modifier == GLUT_ACTIVE_SHIFT)
00105         config->set_campos(0, view_distance, view_x_angle, view_z_angle);
00106       else
00107         get_camera_data(0);
00108       break;
00109     case GLUT_KEY_F2:
00110       if (modifier == GLUT_ACTIVE_SHIFT)
00111         config->set_campos(1, view_distance, view_x_angle, view_z_angle);
00112       else
00113         get_camera_data(1);
00114       break;
00115     case GLUT_KEY_F3:
00116       if (modifier == GLUT_ACTIVE_SHIFT)
00117         config->set_campos(2, view_distance, view_x_angle, view_z_angle);
00118       else
00119         get_camera_data(2);
00120       break;
00121     case GLUT_KEY_F4:
00122       if (modifier == GLUT_ACTIVE_SHIFT)
00123         config->set_campos(3, view_distance, view_x_angle, view_z_angle);
00124       else
00125         get_camera_data(3);
00126       break;
00127                                                                                    
00128     case '\t':
00129       if (in_game_menu) {
00130         main_menu -> hide();
00131         in_game_menu = false;
00132       }
00133       else {
00134         in_game_menu = true;
00135          main_menu-> reveal();
00136       }
00137       break;
00138   }
00139 }
00140 
00141 void displayfn ()
00142 {
00143   update_motion () ;
00144                                                                                    
00145   glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
00146   glClear  ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) ;
00147                                                                                    
00148                                                                                    
00149   ssgCullAndDraw ( scene ) ;
00150                                                                                    
00151   puDisplay();
00152                                                                                    
00153   glutPostRedisplay () ;
00154   glutSwapBuffers () ;
00155 }
00156 
00157 void mousefn (int button, int state, int x, int y)
00158 {
00159   if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
00160   {
00161                                                                                    
00162   }
00163 }
00164       
00165 void init_graphics_once(int argc, char** argv) {
00166   ssgModelPath(MODEL_PATH);
00167   ssgTexturePath(TEXTURE_PATH);
00168  
00169   glutInit(&argc, argv);
00170   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
00171   if (config->get_fullscreen()) {
00172     glutGameModeString(config->get_game_mode_string());
00173     if (glutGameModeGet(GLUT_GAME_MODE_POSSIBLE) != -1) {
00174       glutEnterGameMode();
00175     }
00176     else {
00177       fprintf(stderr, "glut returned error while opening configured fullscreen mode\n");
00178       glutInitWindowSize(config->get_window_width(), config->get_window_height());
00179       win_handle = glutCreateWindow(WINDOW_TITLE);
00180     }
00181   }
00182   else {
00183     glutInitWindowSize(config->get_window_width(), config->get_window_height());
00184     win_handle = glutCreateWindow(WINDOW_TITLE);
00185   }
00186   display_height = config->get_window_height();
00187   display_width = config->get_window_width();
00188   ssgInit();
00189   puInit();                                                                          _register_glutfuncs_menuonly();
00190   glEnable(GL_DEPTH_TEST);
00191   glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
00192   glClear      ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ;
00193 }
00194 
00195 
00196 class wrapper {
00197   public:
00198     wrapper();
00199     ~wrapper();
00200     void go();
00201   private:
00202     GameCore* core;
00203     configuration* cfg;
00204 };
00205 
00206 wrapper::wrapper () {
00207 #ifdef CONFIG_FILE
00208   cfg = new configuration(str(CONFIG_FILE));
00209 #else
00210   cfg = new configuration(NULL);
00211 #endif
00212   config = cfg;
00213 }
00214 
00215 wrapper::~wrapper() {
00216   fprintf(stderr, "got a SIGINT, stopping...\n");
00217   fprintf(stderr, ">deleting scene\n");
00218   delete scene;
00219   fprintf(stderr, ">deleting game core\n");
00220   delete core;
00221   fprintf(stderr, ">deleting config\n");
00222   delete cfg;
00223 }
00224 
00225 void wrapper::go() {
00226   core = new GameCore(scene);
00227   loc_core = core;
00228 }
00229 
00230 wrapper* foo = NULL;
00231 
00232 void sig_catcher(int sig) {
00233   delete foo;
00234   exit(0);
00235 }
00236 
00237 int main ( int argc , char ** argv )
00238 {
00239   foo = new wrapper();
00240   signal(SIGINT, sig_catcher);
00241   init_graphics_once (argc, argv) ;
00242   foo->go();
00243   glutMainLoop  () ;
00244   exit( 0 );
00245 }

Generated on Sat Jul 12 04:29:21 2003 for glPirates by doxygen 1.3.2