1 /*
2  * SDL_funcs.cpp
3  * Copyright (C) 2007 by Bryan Duff <duff0097@gmail.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18  * USA
19  */
20 
21 #include "Game.h"
22 #include "MacInput.h"
23 
24 #include "SDL_funcs.h"
25 extern Config config;
26 
27 static int sdlkeymap[SDLK_LAST];
28 
29 static unsigned char ourkeys[16];
30 
init_sdlkeymap()31 void init_sdlkeymap()
32 {
33   int i;
34 
35   for(i = 0; i < SDLK_LAST; i++) {
36     sdlkeymap[i] = -1;
37   }
38 
39   sdlkeymap[SDLK_1] = MAC_1_KEY;
40   sdlkeymap[SDLK_2] = MAC_2_KEY;
41   sdlkeymap[SDLK_3] = MAC_3_KEY;
42   sdlkeymap[SDLK_4] = MAC_4_KEY;
43   sdlkeymap[SDLK_5] = MAC_5_KEY;
44   sdlkeymap[SDLK_6] = MAC_6_KEY;
45   sdlkeymap[SDLK_7] = MAC_7_KEY;
46   sdlkeymap[SDLK_8] = MAC_8_KEY;
47   sdlkeymap[SDLK_9] = MAC_9_KEY;
48   sdlkeymap[SDLK_0] = MAC_0_KEY;
49   sdlkeymap[SDLK_KP1] = MAC_NUMPAD_1_KEY;
50   sdlkeymap[SDLK_KP2] = MAC_NUMPAD_2_KEY;
51   sdlkeymap[SDLK_KP3] = MAC_NUMPAD_3_KEY;
52   sdlkeymap[SDLK_KP4] = MAC_NUMPAD_4_KEY;
53   sdlkeymap[SDLK_KP5] = MAC_NUMPAD_5_KEY;
54   sdlkeymap[SDLK_KP6] = MAC_NUMPAD_6_KEY;
55   sdlkeymap[SDLK_KP7] = MAC_NUMPAD_7_KEY;
56   sdlkeymap[SDLK_KP8] = MAC_NUMPAD_8_KEY;
57   sdlkeymap[SDLK_KP9] = MAC_NUMPAD_9_KEY;
58   sdlkeymap[SDLK_KP0] = MAC_NUMPAD_0_KEY;
59   sdlkeymap[SDLK_a] = MAC_A_KEY;
60   sdlkeymap[SDLK_b] = MAC_B_KEY;
61   sdlkeymap[SDLK_c] = MAC_C_KEY;
62   sdlkeymap[SDLK_d] = MAC_D_KEY;
63   sdlkeymap[SDLK_e] = MAC_E_KEY;
64   sdlkeymap[SDLK_f] = MAC_F_KEY;
65   sdlkeymap[SDLK_g] = MAC_G_KEY;
66   sdlkeymap[SDLK_h] = MAC_H_KEY;
67   sdlkeymap[SDLK_i] = MAC_I_KEY;
68   sdlkeymap[SDLK_j] = MAC_J_KEY;
69   sdlkeymap[SDLK_k] = MAC_K_KEY;
70   sdlkeymap[SDLK_l] = MAC_L_KEY;
71   sdlkeymap[SDLK_m] = MAC_M_KEY;
72   sdlkeymap[SDLK_n] = MAC_N_KEY;
73   sdlkeymap[SDLK_o] = MAC_O_KEY;
74   sdlkeymap[SDLK_p] = MAC_P_KEY;
75   sdlkeymap[SDLK_q] = MAC_Q_KEY;
76   sdlkeymap[SDLK_r] = MAC_R_KEY;
77   sdlkeymap[SDLK_s] = MAC_S_KEY;
78   sdlkeymap[SDLK_t] = MAC_T_KEY;
79   sdlkeymap[SDLK_u] = MAC_U_KEY;
80   sdlkeymap[SDLK_v] = MAC_V_KEY;
81   sdlkeymap[SDLK_w] = MAC_W_KEY;
82   sdlkeymap[SDLK_x] = MAC_X_KEY;
83   sdlkeymap[SDLK_y] = MAC_Y_KEY;
84   sdlkeymap[SDLK_z] = MAC_Z_KEY;
85   sdlkeymap[SDLK_F1] = MAC_F1_KEY;
86   sdlkeymap[SDLK_F2] = MAC_F2_KEY;
87   sdlkeymap[SDLK_F3] = MAC_F3_KEY;
88   sdlkeymap[SDLK_F4] = MAC_F4_KEY;
89   sdlkeymap[SDLK_F5] = MAC_F5_KEY;
90   sdlkeymap[SDLK_F6] = MAC_F6_KEY;
91   sdlkeymap[SDLK_F7] = MAC_F7_KEY;
92   sdlkeymap[SDLK_F8] = MAC_F8_KEY;
93   sdlkeymap[SDLK_F9] = MAC_F9_KEY;
94   sdlkeymap[SDLK_F10] = MAC_F10_KEY;
95   sdlkeymap[SDLK_F11] = MAC_F11_KEY;
96   sdlkeymap[SDLK_F12] = MAC_F12_KEY;
97   sdlkeymap[SDLK_RETURN] = MAC_RETURN_KEY;
98   sdlkeymap[SDLK_KP_ENTER] = MAC_ENTER_KEY;
99   sdlkeymap[SDLK_TAB] = MAC_TAB_KEY;
100   sdlkeymap[SDLK_SPACE] = MAC_SPACE_KEY;
101   sdlkeymap[SDLK_BACKSPACE] = MAC_DELETE_KEY;
102   sdlkeymap[SDLK_ESCAPE] = MAC_ESCAPE_KEY;
103   sdlkeymap[SDLK_LCTRL] = MAC_CONTROL_KEY;
104   sdlkeymap[SDLK_RCTRL] = MAC_CONTROL_KEY;
105   sdlkeymap[SDLK_LSHIFT] = MAC_SHIFT_KEY;
106   sdlkeymap[SDLK_RSHIFT] = MAC_SHIFT_KEY;
107   sdlkeymap[SDLK_CAPSLOCK] = MAC_CAPS_LOCK_KEY;
108   sdlkeymap[SDLK_LALT] = MAC_OPTION_KEY;
109   sdlkeymap[SDLK_RALT] = MAC_OPTION_KEY;
110   sdlkeymap[SDLK_PAGEUP] = MAC_PAGE_UP_KEY;
111   sdlkeymap[SDLK_PAGEDOWN] = MAC_PAGE_DOWN_KEY;
112   sdlkeymap[SDLK_INSERT] = MAC_INSERT_KEY;
113   sdlkeymap[SDLK_DELETE] = MAC_DEL_KEY;
114   sdlkeymap[SDLK_HOME] = MAC_HOME_KEY;
115   sdlkeymap[SDLK_END] = MAC_END_KEY;
116   sdlkeymap[SDLK_LEFTBRACKET] = MAC_LEFT_BRACKET_KEY;
117   sdlkeymap[SDLK_RIGHTBRACKET] = MAC_RIGHT_BRACKET_KEY;
118   sdlkeymap[SDLK_UP] = MAC_ARROW_UP_KEY;
119   sdlkeymap[SDLK_DOWN] = MAC_ARROW_DOWN_KEY;
120   sdlkeymap[SDLK_LEFT] = MAC_ARROW_LEFT_KEY;
121   sdlkeymap[SDLK_RIGHT] = MAC_ARROW_RIGHT_KEY;
122 
123   return;
124 }
125 
GetKeys(unsigned long * keys)126 void GetKeys(unsigned long *keys)
127 {
128   /* this is just weird */
129   memcpy(keys, ourkeys, sizeof(ourkeys));
130 }
131 
DoSDLKey(SDL_Event * event)132 void DoSDLKey(SDL_Event * event)
133 {
134   int mackey;
135   int index;
136   int mask;
137   int press = (event->type == SDL_KEYDOWN) ? 1 : 0;
138 
139   mackey = sdlkeymap[event->key.keysym.sym];
140 
141   if(mackey != -1) {
142     index = mackey / 8;
143     mask = 1 << (mackey % 8);
144 
145     if(press) {
146       ourkeys[index] |= mask;
147     } else {
148       ourkeys[index] &= ~mask;
149     }
150   }
151 
152   if(event->key.keysym.unicode && !(event->key.keysym.unicode & 0xFF80)) {
153 //#if _GAME
154     Game::getInstance().HandleKeyDown(event->key.keysym.unicode);
155 //#endif
156 #if _VIEWER
157     Viewer::getInstance().HandleKeyDown(event->key.keysym.unicode);
158 #endif
159   }
160 }
161 
ProcessSDLEvents()162 void ProcessSDLEvents()
163 {
164   SDL_Event event;
165 
166   if(SDL_PollEvent(&event)) {
167     do {
168       switch (event.type) {
169         case SDL_KEYDOWN:
170           if(event.key.keysym.sym == SDLK_RETURN &&
171              event.key.keysym.mod & KMOD_ALT) {
172             SDL_WM_ToggleFullScreen(SDL_GetVideoSurface());
173             break;
174           }
175           if(event.key.keysym.sym == SDLK_g && event.key.keysym.mod & KMOD_CTRL) {
176             if(SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_OFF) {
177               SDL_WM_GrabInput(SDL_GRAB_ON);
178               SDL_ShowCursor(SDL_DISABLE);
179             } else {
180               SDL_WM_GrabInput(SDL_GRAB_OFF);
181               SDL_ShowCursor(SDL_ENABLE);
182             }
183             break;
184           }
185         case SDL_KEYUP:
186           DoSDLKey(&event);
187           break;
188         case SDL_QUIT:
189           exit(0);
190       }
191     } while(SDL_PollEvent(&event));
192   }
193 }
194 
InitGL(void)195 int InitGL(void)
196 {
197   int screenwidth = config.screenwidth;
198   int screenheight = config.screenheight;
199 
200   //Setup screen
201   if(SDL_Init(SDL_INIT_VIDEO) == -1) {
202     fprintf(stderr, "SDL Init Video failed: %s\n", SDL_GetError());
203     exit(EXIT_FAILURE);
204   }
205 
206   atexit(SDL_Quit);
207 
208   SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
209   SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
210   SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
211   SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
212   SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
213 
214   if(screenwidth < 640 || screenheight < 480) {
215     int fsFlag = 0;
216     if(config.fullscreen == 1) {
217       fsFlag = SDL_FULLSCREEN;
218     }
219     if(SDL_SetVideoMode(640, 480, 0, SDL_OPENGL | fsFlag) == NULL) {
220       fprintf(stderr, "(OpenGL) SDL SetVideoMode failed: %s\n", SDL_GetError());
221       exit(EXIT_FAILURE);
222     }
223   } else {
224     int fsFlag = 0;
225     if(config.fullscreen == 1) {
226       fsFlag = SDL_FULLSCREEN;
227     }
228     if(SDL_SetVideoMode
229        (screenwidth, screenheight, 0, SDL_OPENGL | fsFlag) == NULL) {
230       fprintf(stderr, "(OpenGL) SDL SetVideoMode failed: %s\n", SDL_GetError());
231       exit(EXIT_FAILURE);
232     }
233   }
234 
235   const SDL_VideoInfo* info = SDL_GetVideoInfo();
236 
237   if(!info) {
238     fprintf(stdout, "Video query failed: %s\n",
239              SDL_GetError());
240   }
241 
242   config.bpp = info->vfmt->BitsPerPixel;
243 
244   SDL_WM_SetCaption("Black Shades Elite", "Black Shades Elite");
245 
246   SDL_EnableUNICODE(1);         /* toggle it to ON */
247 
248   if(config.fullscreen) {
249     SDL_WM_GrabInput(SDL_GRAB_ON);
250     SDL_ShowCursor(0);
251   }
252 
253   glAlphaFunc(GL_GREATER, 0.01);
254   glDepthFunc(GL_LESS);
255 
256   glPolygonOffset(-8, 0);
257   glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
258 
259   return TRUE;
260 }
261 
262 /// far == viewdistance
ReSizeGLScene(float fov,float near,float far)263 GLvoid ReSizeGLScene(float fov, float near, float far)
264 {
265   int screenwidth = config.screenwidth;
266   int screenheight = config.screenheight;
267 
268   if(screenheight == 0) {
269     screenheight = 1;
270   }
271 
272   glViewport(0, 0, screenwidth, screenheight);
273 
274   glMatrixMode(GL_PROJECTION);
275 
276   glLoadIdentity();
277 
278   gluPerspective(fov, (GLfloat) screenwidth / (GLfloat) screenheight, near,
279                  far);
280 
281   glMatrixMode(GL_MODELVIEW);
282 
283   glLoadIdentity();
284 }
285 
286