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