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
00041 ssgRoot* scene = NULL;
00042
00043
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 ))
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 }