00001 #include "lugre_prefix.h"
00002 #include "lugre_input.h"
00003 #include <string.h>
00004
00005 #if LUGRE_PLATFORM == LUGRE_PLATFORM_APPLE
00006 #include <OIS/OIS.h>
00007 #else
00008 #include <OIS.h>
00009 #endif
00010
00011 namespace Lugre {
00012
00013
00014
00015 bool cInput::bKeys[256];
00016 bool cInput::bButton[3];
00017 int cInput::iMouseWheel;
00018 int cInput::iMouseWheel_pressed;
00019 int cInput::iMouseWheel_all_since_last_step;
00020 int cInput::iMouseWheel_pressed_since_last_step;
00021 int cInput::iMouse[2];
00022 std::list<cInputListener*> cInput::mListeners;
00023
00024 void InitKeyMapOIS ();
00025
00026 const char * cInput::szKeyNames[256] = {
00027 "",
00028 "mouse1",
00029 "mouse2",
00030 "mouse3",
00031 "mouse4",
00032 "mouse5",
00033 "wheeldown",
00034 "wheelup",
00035 "backspace",
00036 "tab",
00037 "",
00038 "",
00039 "stopclear",
00040 "return",
00041 "np_enter",
00042 "",
00043
00044
00045 "lshift",
00046 "lcontrol",
00047 "lalt",
00048 "pause",
00049 "capslock",
00050 "","","","","",
00051 "",
00052 "escape",
00053 "","","","",
00054
00055
00056 "space",
00057 "pgup",
00058 "pgdn",
00059 "end",
00060 "home",
00061 "left",
00062 "up",
00063 "right",
00064 "down",
00065 "",
00066 "",
00067 "",
00068 "screen",
00069 "ins",
00070 "del",
00071 "",
00072
00073
00074 "0",
00075 "1",
00076 "2",
00077 "3",
00078 "4",
00079 "5",
00080 "6",
00081 "7",
00082 "8",
00083 "9",
00084 "",
00085 "","","","","",
00086
00087
00088 "",
00089 "a",
00090 "b",
00091 "c",
00092 "d",
00093 "e",
00094 "f",
00095 "g",
00096 "h",
00097 "i",
00098 "j",
00099 "k",
00100 "l",
00101 "m",
00102 "n",
00103 "o",
00104
00105
00106 "p",
00107 "q",
00108 "r",
00109 "s",
00110 "t",
00111 "u",
00112 "v",
00113 "w",
00114 "x",
00115 "y",
00116 "z",
00117 "lwin",
00118 "rwin",
00119 "menu",
00120 "",
00121 "",
00122
00123
00124
00125 "np0",
00126 "np1",
00127 "np2",
00128 "np3",
00129 "np4",
00130 "np5",
00131 "np6",
00132 "np7",
00133 "np8",
00134 "np9",
00135 "npmult",
00136 "npadd",
00137 "",
00138 "npsub",
00139 "npkomma",
00140 "npdiv",
00141
00142
00143 "f1",
00144 "f2",
00145 "f3",
00146 "f4",
00147 "f5",
00148 "f6",
00149 "f7",
00150 "f8",
00151 "f9",
00152 "f10",
00153 "f11",
00154 "f12",
00155 "f13",
00156 "f14",
00157 "f15",
00158 "",
00159
00160
00161
00162 "","","","","","","","","","","","","","","","",
00163
00164
00165 "numlock","scroll",
00166 "","","","","","","","","","","","","","",
00167
00168
00169 "","rshift",
00170 "","rcontrol",
00171 "","ralt",
00172 "","","","","","","","","","",
00173
00174
00175 "","","","","","","","","","",
00176 "ue",
00177 "plus",
00178 "komma",
00179 "minus",
00180 "point",
00181 "grid",
00182
00183
00184 "oe","","","","","","","","","","","","","","","",
00185
00186
00187 "","","","","","","","","","","",
00188 "bslash",
00189 "console",
00190 "accent",
00191 "ae",
00192 "",
00193
00194
00195 "","","greater","","","","","","","","","","","","","",
00196
00197
00198 "","","","","","","","","","","","","","","",""
00199 };
00200
00201
00202
00203
00204
00205
00206 cInput::cInput () { PROFILE Reset(); InitKeyMapOIS(); }
00207
00211 void cInput::Reset () { PROFILE
00212 memset(bKeys,0,sizeof(bool)*256);
00213 memset(bButton,0,sizeof(bool)*3);
00214 iMouse[0] = 0;
00215 iMouse[1] = 0;
00216 iMouseWheel = 0;
00217 iMouseWheel_pressed = 0;
00218 iMouseWheel_all_since_last_step = 0;
00219 iMouseWheel_pressed_since_last_step = 0;
00220 }
00221
00223 void cInput::Step() { PROFILE
00224
00225 iMouseWheel_all_since_last_step = 0;
00226 iMouseWheel_pressed_since_last_step = 0;
00227 }
00228
00230 void cInput::FocusChange (const bool bGain) { PROFILE
00231 if (bGain) Reset();
00232 }
00233
00234
00240 unsigned char cInput::KeyConvertWin (const int iVKey,const bool bRight) { PROFILE
00241 if (bRight && iVKey == kkey_lshift) return kkey_rshift;
00242 if (bRight && iVKey == kkey_lcontrol) return kkey_rcontrol;
00243 if (bRight && iVKey == kkey_lalt) return kkey_ralt;
00244 if (bRight && iVKey == kkey_return) return kkey_np_enter;
00245 return iVKey;
00246 }
00247
00248
00249
00250 std::map<unsigned int,unsigned char> gKeyMapOIS;
00251 std::map<unsigned char,unsigned int> gKeyMapOISInv;
00252
00253
00254
00255 unsigned int cInput::KeyConvertOISInv (const char iKey) { PROFILE
00256 return gKeyMapOISInv[iKey];
00257 }
00258
00259 unsigned char cInput::KeyConvertOIS (const int iKeyCode) { PROFILE
00260 if (iKeyCode > 0 && !gKeyMapOIS[iKeyCode]) printf("unknown OIS key %d\n",iKeyCode);
00261 return gKeyMapOIS[iKeyCode];
00262 }
00263
00264 void InitKeyMapOIS () { PROFILE
00265 #define ADD_gKeyMapOIS(OISkeycode,robkeycode) gKeyMapOIS[OISkeycode] = robkeycode; gKeyMapOISInv[robkeycode] = OISkeycode;
00266
00267
00268 ADD_gKeyMapOIS(OIS::KC_ESCAPE ,cInput::kkey_escape)
00269 ADD_gKeyMapOIS(OIS::KC_1 ,cInput::kkey_1)
00270 ADD_gKeyMapOIS(OIS::KC_2 ,cInput::kkey_2)
00271 ADD_gKeyMapOIS(OIS::KC_3 ,cInput::kkey_3)
00272 ADD_gKeyMapOIS(OIS::KC_4 ,cInput::kkey_4)
00273 ADD_gKeyMapOIS(OIS::KC_5 ,cInput::kkey_5)
00274 ADD_gKeyMapOIS(OIS::KC_6 ,cInput::kkey_6)
00275 ADD_gKeyMapOIS(OIS::KC_7 ,cInput::kkey_7)
00276 ADD_gKeyMapOIS(OIS::KC_8 ,cInput::kkey_8)
00277 ADD_gKeyMapOIS(OIS::KC_9 ,cInput::kkey_9)
00278 ADD_gKeyMapOIS(OIS::KC_0 ,cInput::kkey_0)
00279 ADD_gKeyMapOIS(OIS::KC_MINUS ,cInput::kkey_minus)
00280 ADD_gKeyMapOIS(OIS::KC_BACK ,cInput::kkey_back)
00281
00282 ADD_gKeyMapOIS(OIS::KC_TAB ,cInput::kkey_tab)
00283 ADD_gKeyMapOIS(OIS::KC_Q ,cInput::kkey_q)
00284 ADD_gKeyMapOIS(OIS::KC_W ,cInput::kkey_w)
00285 ADD_gKeyMapOIS(OIS::KC_E ,cInput::kkey_e)
00286 ADD_gKeyMapOIS(OIS::KC_R ,cInput::kkey_r)
00287 ADD_gKeyMapOIS(OIS::KC_T ,cInput::kkey_t)
00288 ADD_gKeyMapOIS(OIS::KC_Y ,cInput::kkey_y)
00289 ADD_gKeyMapOIS(OIS::KC_U ,cInput::kkey_u)
00290 ADD_gKeyMapOIS(OIS::KC_I ,cInput::kkey_i)
00291 ADD_gKeyMapOIS(OIS::KC_O ,cInput::kkey_o)
00292 ADD_gKeyMapOIS(OIS::KC_P ,cInput::kkey_p)
00293
00294
00295 ADD_gKeyMapOIS(OIS::KC_RETURN ,cInput::kkey_return)
00296 ADD_gKeyMapOIS(OIS::KC_LCONTROL ,cInput::kkey_lcontrol)
00297 ADD_gKeyMapOIS(OIS::KC_A ,cInput::kkey_a)
00298 ADD_gKeyMapOIS(OIS::KC_S ,cInput::kkey_s)
00299 ADD_gKeyMapOIS(OIS::KC_D ,cInput::kkey_d)
00300 ADD_gKeyMapOIS(OIS::KC_F ,cInput::kkey_f)
00301 ADD_gKeyMapOIS(OIS::KC_G ,cInput::kkey_g)
00302 ADD_gKeyMapOIS(OIS::KC_H ,cInput::kkey_h)
00303 ADD_gKeyMapOIS(OIS::KC_J ,cInput::kkey_j)
00304 ADD_gKeyMapOIS(OIS::KC_K ,cInput::kkey_k)
00305 ADD_gKeyMapOIS(OIS::KC_L ,cInput::kkey_l)
00306
00307
00308
00309 ADD_gKeyMapOIS(OIS::KC_LSHIFT ,cInput::kkey_lshift)
00310
00311 ADD_gKeyMapOIS(OIS::KC_Z ,cInput::kkey_z)
00312 ADD_gKeyMapOIS(OIS::KC_X ,cInput::kkey_x)
00313 ADD_gKeyMapOIS(OIS::KC_C ,cInput::kkey_c)
00314 ADD_gKeyMapOIS(OIS::KC_V ,cInput::kkey_v)
00315 ADD_gKeyMapOIS(OIS::KC_B ,cInput::kkey_b)
00316 ADD_gKeyMapOIS(OIS::KC_N ,cInput::kkey_n)
00317 ADD_gKeyMapOIS(OIS::KC_M ,cInput::kkey_m)
00318 ADD_gKeyMapOIS(OIS::KC_COMMA ,cInput::kkey_komma)
00319 ADD_gKeyMapOIS(OIS::KC_PERIOD ,cInput::kkey_point)
00320
00321 ADD_gKeyMapOIS(OIS::KC_RSHIFT ,cInput::kkey_rshift)
00322 ADD_gKeyMapOIS(OIS::KC_MULTIPLY ,cInput::kkey_np_mult)
00323 ADD_gKeyMapOIS(OIS::KC_LMENU ,cInput::kkey_lalt)
00324 ADD_gKeyMapOIS(OIS::KC_SPACE ,cInput::kkey_space)
00325 ADD_gKeyMapOIS(OIS::KC_CAPITAL ,cInput::kkey_capslock)
00326 ADD_gKeyMapOIS(OIS::KC_F1 ,cInput::kkey_f1)
00327 ADD_gKeyMapOIS(OIS::KC_F2 ,cInput::kkey_f2)
00328 ADD_gKeyMapOIS(OIS::KC_F3 ,cInput::kkey_f3)
00329 ADD_gKeyMapOIS(OIS::KC_F4 ,cInput::kkey_f4)
00330 ADD_gKeyMapOIS(OIS::KC_F5 ,cInput::kkey_f5)
00331 ADD_gKeyMapOIS(OIS::KC_F6 ,cInput::kkey_f6)
00332 ADD_gKeyMapOIS(OIS::KC_F7 ,cInput::kkey_f7)
00333 ADD_gKeyMapOIS(OIS::KC_F8 ,cInput::kkey_f8)
00334 ADD_gKeyMapOIS(OIS::KC_F9 ,cInput::kkey_f9)
00335 ADD_gKeyMapOIS(OIS::KC_F10 ,cInput::kkey_f10)
00336 ADD_gKeyMapOIS(OIS::KC_NUMLOCK ,cInput::kkey_numlock)
00337 ADD_gKeyMapOIS(OIS::KC_SCROLL ,cInput::kkey_scroll)
00338 ADD_gKeyMapOIS(OIS::KC_NUMPAD7 ,cInput::kkey_numpad7)
00339 ADD_gKeyMapOIS(OIS::KC_NUMPAD8 ,cInput::kkey_numpad8)
00340 ADD_gKeyMapOIS(OIS::KC_NUMPAD9 ,cInput::kkey_numpad9)
00341 ADD_gKeyMapOIS(OIS::KC_SUBTRACT ,cInput::kkey_np_sub)
00342 ADD_gKeyMapOIS(OIS::KC_NUMPAD4 ,cInput::kkey_numpad4)
00343 ADD_gKeyMapOIS(OIS::KC_NUMPAD5 ,cInput::kkey_numpad5)
00344 ADD_gKeyMapOIS(OIS::KC_NUMPAD6 ,cInput::kkey_numpad6)
00345 ADD_gKeyMapOIS(OIS::KC_ADD ,cInput::kkey_np_add)
00346 ADD_gKeyMapOIS(OIS::KC_NUMPAD1 ,cInput::kkey_numpad1)
00347 ADD_gKeyMapOIS(OIS::KC_NUMPAD2 ,cInput::kkey_numpad2)
00348 ADD_gKeyMapOIS(OIS::KC_NUMPAD3 ,cInput::kkey_numpad3)
00349 ADD_gKeyMapOIS(OIS::KC_NUMPAD0 ,cInput::kkey_numpad0)
00350 ADD_gKeyMapOIS(OIS::KC_DECIMAL ,cInput::kkey_np_komma)
00351 ADD_gKeyMapOIS(OIS::KC_OEM_102 ,cInput::kkey_greater)
00352 ADD_gKeyMapOIS(OIS::KC_F11 ,cInput::kkey_f11)
00353 ADD_gKeyMapOIS(OIS::KC_F12 ,cInput::kkey_f12)
00354 ADD_gKeyMapOIS(OIS::KC_F13 ,cInput::kkey_f13)
00355 ADD_gKeyMapOIS(OIS::KC_F14 ,cInput::kkey_f14)
00356 ADD_gKeyMapOIS(OIS::KC_F15 ,cInput::kkey_f15)
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375 ADD_gKeyMapOIS(OIS::KC_NUMPADENTER ,cInput::kkey_np_enter)
00376 ADD_gKeyMapOIS(OIS::KC_RCONTROL ,cInput::kkey_rcontrol)
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388 ADD_gKeyMapOIS(OIS::KC_SYSRQ ,cInput::kkey_screen)
00389 ADD_gKeyMapOIS(OIS::KC_RMENU ,cInput::kkey_ralt)
00390 ADD_gKeyMapOIS(OIS::KC_PAUSE ,cInput::kkey_pause)
00391 ADD_gKeyMapOIS(OIS::KC_HOME ,cInput::kkey_home)
00392 ADD_gKeyMapOIS(OIS::KC_UP ,cInput::kkey_up)
00393 ADD_gKeyMapOIS(OIS::KC_PGUP ,cInput::kkey_prior)
00394 ADD_gKeyMapOIS(OIS::KC_LEFT ,cInput::kkey_left)
00395 ADD_gKeyMapOIS(OIS::KC_RIGHT ,cInput::kkey_right)
00396 ADD_gKeyMapOIS(OIS::KC_END ,cInput::kkey_end)
00397 ADD_gKeyMapOIS(OIS::KC_DOWN ,cInput::kkey_down)
00398 ADD_gKeyMapOIS(OIS::KC_PGDOWN ,cInput::kkey_next)
00399 ADD_gKeyMapOIS(OIS::KC_INSERT ,cInput::kkey_ins)
00400 ADD_gKeyMapOIS(OIS::KC_DELETE ,cInput::kkey_del)
00401 ADD_gKeyMapOIS(OIS::KC_LWIN ,cInput::kkey_lwin)
00402 ADD_gKeyMapOIS(OIS::KC_RWIN ,cInput::kkey_rwin)
00403 ADD_gKeyMapOIS(OIS::KC_APPS ,cInput::kkey_menu)
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428 }
00429
00430
00435 unsigned char cInput::GetNamedKey (const char* szName) { PROFILE
00436 int i;for (i=0;i<256;i++)
00437 if (*szKeyNames[i] != 0)
00438 if (mystricmp(szKeyNames[i],szName) == 0)
00439 return i;
00440 return 0;
00441 }
00442
00444 const char* cInput::GetKeyName (const unsigned char iKey) { PROFILE
00445 return szKeyNames[iKey];
00446 }
00447
00448
00454 void cInput::KeyDown (const unsigned char iKey,const int iLetter) { PROFILE
00455 bool bIsRepetition = bKeys[iKey];
00456
00457
00458 bKeys[iKey] = true;
00459 if (iKey == kkey_mouse1) bButton[0] = true;
00460 if (iKey == kkey_mouse2) bButton[1] = true;
00461 if (iKey == kkey_mouse3) bButton[2] = true;
00462 if (iKey == kkey_wheelup) {
00463 iMouseWheel++;
00464 iMouseWheel_all_since_last_step++;
00465 if (!bIsRepetition) {
00466 iMouseWheel_pressed++;
00467 iMouseWheel_pressed_since_last_step++;
00468 }
00469 }
00470 if (iKey == kkey_wheeldown) {
00471 iMouseWheel--;
00472 iMouseWheel_all_since_last_step--;
00473 if (!bIsRepetition) {
00474 iMouseWheel_pressed--;
00475 iMouseWheel_pressed_since_last_step--;
00476 }
00477 }
00478
00479 for (std::list<cInputListener*>::iterator itor=mListeners.begin();itor!=mListeners.end();++itor) {
00480 if (bIsRepetition)
00481 (*itor)->Notify_KeyRepeat(iKey,iLetter);
00482 else (*itor)->Notify_KeyPress(iKey,iLetter);
00483 }
00484 }
00485
00486
00487
00492 void cInput::KeyUp (const unsigned char iKey) { PROFILE
00493
00494 bKeys[iKey] = false;
00495 if (iKey == kkey_mouse1) bButton[0] = false;
00496 if (iKey == kkey_mouse2) bButton[1] = false;
00497 if (iKey == kkey_mouse3) bButton[2] = false;
00498
00499 for (std::list<cInputListener*>::iterator itor=mListeners.begin();itor!=mListeners.end();++itor) {
00500 (*itor)->Notify_KeyRelease(iKey);
00501 }
00502 }
00503
00504 };