00001 /* 00002 ----------------------------------------------------------------------------- 00003 This source file is part of OGRE 00004 (Object-oriented Graphics Rendering Engine) 00005 For the latest info, see http://www.ogre3d.org/ 00006 00007 Copyright © 2000-2002 The OGRE Team 00008 Also see acknowledgements in Readme.html 00009 00010 This program is free software; you can redistribute it and/or modify it under 00011 the terms of the GNU Lesser General Public License as published by the Free Software 00012 Foundation; either version 2 of the License, or (at your option) any later 00013 version. 00014 00015 This program is distributed in the hope that it will be useful, but WITHOUT 00016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 00018 00019 You should have received a copy of the GNU Lesser General Public License along with 00020 this program; if not, write to the Free Software Foundation, Inc., 59 Temple 00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to 00022 http://www.gnu.org/copyleft/lesser.txt. 00023 ----------------------------------------------------------------------------- 00024 */ 00025 #include "OgreStableHeaders.h" 00026 00027 #include "OgreInput.h" 00028 #include "OgreCursor.h" 00029 #include "OgreEventQueue.h" 00030 #include "OgreKeyEvent.h" 00031 #include "OgreEventListeners.h" 00032 00033 00034 namespace Ogre { 00035 static KeyChars sKeyChars; 00036 bool InputReader::sKeysInitialised = false; 00037 //----------------------------------------------------------------------- 00038 InputReader::InputReader() 00039 { 00040 mCursor = 0; 00041 mModifiers = 0; 00042 mEventQueue = 0; 00043 mUseBufferedKeys = false; 00044 mUseBufferedMouse = false; 00045 if (!sKeysInitialised) 00046 { 00047 setupKeyChars(); 00048 sKeysInitialised = true; 00049 } 00050 } 00051 00052 //----------------------------------------------------------------------- 00053 void InputReader::useBufferedInput(EventQueue* pEventQueue, bool keys, bool mouse) 00054 { 00055 mEventQueue = pEventQueue; 00056 00057 if (mCursor) 00058 delete mCursor; 00059 00060 mCursor = new Cursor(); 00061 00062 // initial states of buffered don't call setBufferedInput 00063 // because that can be overriden (in the future) to save releasing and acquiring unchanged inputs 00064 // if we ever decide to release and acquire devices 00065 mUseBufferedKeys = keys; 00066 mUseBufferedMouse = mouse; 00067 } 00068 00069 //----------------------------------------------------------------------- 00070 void InputReader::setBufferedInput(bool keys, bool mouse) 00071 { 00072 mUseBufferedKeys = keys; 00073 mUseBufferedMouse = mouse; 00074 } 00075 00076 00077 //----------------------------------------------------------------------- 00078 InputReader::~InputReader() 00079 { 00080 if (mCursor) 00081 { 00082 delete mCursor; 00083 } 00084 } 00085 00086 //----------------------------------------------------------------------- 00087 void InputReader::triggerMouseButton(int nMouseCode, bool mousePressed) 00088 { 00089 if (mousePressed) 00090 { 00091 mModifiers |= nMouseCode; 00092 createMouseEvent(MouseEvent::ME_MOUSE_PRESSED, nMouseCode); 00093 00094 } 00095 else 00096 { // button up... trigger MouseReleased, and MouseClicked 00097 mModifiers &= !nMouseCode; 00098 createMouseEvent(MouseEvent::ME_MOUSE_RELEASED, nMouseCode); 00099 //createMouseEvent(MouseEvent::ME_MOUSE_CLICKED, nMouseCode); JCA - moved to EventDispatcher 00100 } 00101 } 00102 00103 //----------------------------------------------------------------------- 00104 void InputReader::createMouseEvent(int id, int button) 00105 { 00106 MouseEvent* me = 00107 new MouseEvent( 00108 NULL, id, button, 0, // hack fix time 00109 mModifiers, 00110 mCursor->getX(), mCursor->getY(), mCursor->getZ(), 00111 mCursor->getRelX(), mCursor->getRelY(), mCursor->getRelZ(), 00112 0 00113 ); // hack fix click count 00114 00115 mCursor->processEvent(me); 00116 mEventQueue->push(me); 00117 00118 } 00119 00120 00121 00122 //----------------------------------------------------------------------- 00123 void InputReader::createKeyEvent(int id, int key) 00124 { 00125 KeyEvent* ke = new KeyEvent(NULL, id, key, 0, // hack fix time 00126 mModifiers); // hack fix click count 00127 mEventQueue->push(ke); 00128 00129 } 00130 00131 //----------------------------------------------------------------------- 00132 void InputReader::mouseMoved() 00133 { 00134 00135 if (mModifiers & InputEvent::BUTTON_ANY_MASK) // don't need to know which button. you can get that from the modifiers 00136 { 00137 createMouseEvent(MouseEvent::ME_MOUSE_DRAGGED, 0); 00138 } 00139 else 00140 { 00141 createMouseEvent(MouseEvent::ME_MOUSE_MOVED, 0); 00142 } 00143 00144 } 00145 //----------------------------------------------------------------------- 00146 void InputReader::addCursorMoveListener(MouseMotionListener* c) 00147 { 00148 mCursor->addMouseMotionListener(c); 00149 } 00150 //----------------------------------------------------------------------- 00151 void InputReader::removeCursorMoveListener(MouseMotionListener* c) 00152 { 00153 mCursor->removeMouseMotionListener(c); 00154 } 00155 //----------------------------------------------------------------------- 00156 00157 void InputReader::keyChanged(int key, bool down) 00158 { 00159 if (down) 00160 { 00161 switch (key) { 00162 case KC_LMENU : 00163 case KC_RMENU : 00164 mModifiers |= InputEvent::ALT_MASK; 00165 break; 00166 00167 case KC_LSHIFT : 00168 case KC_RSHIFT : 00169 mModifiers |= InputEvent::SHIFT_MASK; 00170 break; 00171 00172 case KC_LCONTROL : 00173 case KC_RCONTROL : 00174 mModifiers |= InputEvent::CTRL_MASK; 00175 break; 00176 } 00177 00178 createKeyEvent(KeyEvent::KE_KEY_PRESSED, key); 00179 } 00180 else 00181 { 00182 switch (key) { 00183 case KC_LMENU : 00184 case KC_RMENU : 00185 mModifiers &= ~InputEvent::ALT_MASK; 00186 break; 00187 00188 case KC_LSHIFT : 00189 case KC_RSHIFT : 00190 mModifiers &= ~InputEvent::SHIFT_MASK; 00191 break; 00192 00193 case KC_LCONTROL : 00194 case KC_RCONTROL : 00195 mModifiers &= ~InputEvent::CTRL_MASK; 00196 break; 00197 } 00198 00199 createKeyEvent(KeyEvent::KE_KEY_RELEASED, key); 00200 createKeyEvent(KeyEvent::KE_KEY_CLICKED, key); 00201 } 00202 } 00203 00204 00205 char InputReader::getKeyChar(int keyCode, long modifiers) 00206 { 00207 char c = 0; 00208 00209 KeyChars::iterator i = sKeyChars.find(KEYCODE(keyCode, modifiers)); 00210 if (i != sKeyChars.end()) 00211 c = i->second; 00212 return c; 00213 } 00214 00215 void InputReader::setupKeyChars() 00216 { 00217 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_1), '1') ); 00218 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_2), '2') ); 00219 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_3), '3') ); 00220 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_4), '4') ); 00221 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_5), '5') ); 00222 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_6), '6') ); 00223 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_7), '7') ); 00224 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_8), '8') ); 00225 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_9), '9') ); 00226 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_0), '0') ); 00227 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_MINUS), '-') );/* - on main keyboard */ 00228 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_EQUALS), '=') ); 00229 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_Q), 'q') ); 00230 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_W), 'w') ); 00231 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_E), 'e') ); 00232 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_R), 'r') ); 00233 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_T), 't') ); 00234 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_Y), 'y') ); 00235 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_U), 'u') ); 00236 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_I), 'i') ); 00237 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_O), 'o') ); 00238 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_P), 'p') ); 00239 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_LBRACKET), '[') ); 00240 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_RBRACKET), ']') ); 00241 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_A), 'a') ); 00242 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_S), 's') ); 00243 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_D), 'd') ); 00244 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_F), 'f') ); 00245 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_G), 'g') ); 00246 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_H), 'h') ); 00247 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_J), 'j') ); 00248 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_K), 'k') ); 00249 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_L), 'l') ); 00250 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_SEMICOLON), ';') ); 00251 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_APOSTROPHE), '\'') ); 00252 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_GRAVE), '`') ); /* accent grave */ 00253 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_BACKSLASH), '\\') ); 00254 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_Z), 'z') ); 00255 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_X), 'x') ); 00256 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_C), 'c') ); 00257 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_V), 'v') ); 00258 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_B), 'b') ); 00259 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_N), 'n') ); 00260 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_M), 'm') ); 00261 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_COMMA), ',') ); 00262 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_PERIOD), '.') ); /* . on main keyboard */ 00263 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_SLASH), '/') ); /* '/' on main keyboard */ 00264 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_MULTIPLY), '*') ); /* * on numeric keypad */ 00265 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_SPACE), ' ') ); 00266 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_NUMPAD7), '7') ); 00267 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_NUMPAD8), '8') ); 00268 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_NUMPAD9), '9') ); 00269 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_SUBTRACT), '-') ); /* - on numeric keypad */ 00270 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_NUMPAD4), '4') ); 00271 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_NUMPAD5), '5') ); 00272 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_NUMPAD6), '6') ); 00273 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_ADD), '+') ); /* + on numeric keypad */ 00274 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_NUMPAD1), '1') ); 00275 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_NUMPAD2), '2') ); 00276 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_NUMPAD3), '3') ); 00277 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_NUMPAD0), '0') ); 00278 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_DECIMAL), '.') ); /* . on numeric keypad */ 00279 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_NUMPADEQUALS), '=') ); /* = on numeric keypad (NEC PC98) */ 00280 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_AT), '@') ); /* (NEC PC98) */ 00281 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_COLON), ':') ); /* (NEC PC98) */ 00282 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_UNDERLINE), '_') ); /* (NEC PC98) */ 00283 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_NUMPADCOMMA), ',') ); /* , on numeric keypad (NEC PC98) */ 00284 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_DIVIDE), '/') ); /* / on numeric keypad */ 00285 00286 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_1, InputEvent::SHIFT_MASK), '!') ); 00287 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_2, InputEvent::SHIFT_MASK), '@') ); 00288 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_3, InputEvent::SHIFT_MASK), '#') ); 00289 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_4, InputEvent::SHIFT_MASK), '$') ); 00290 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_5, InputEvent::SHIFT_MASK), '%') ); 00291 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_6, InputEvent::SHIFT_MASK), '^') ); 00292 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_7, InputEvent::SHIFT_MASK), '&') ); 00293 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_8, InputEvent::SHIFT_MASK), '*') ); 00294 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_9, InputEvent::SHIFT_MASK), '(') ); 00295 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_0, InputEvent::SHIFT_MASK), ')') ); 00296 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_MINUS, InputEvent::SHIFT_MASK), '_') ); 00297 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_EQUALS, InputEvent::SHIFT_MASK), '+') ); 00298 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_Q, InputEvent::SHIFT_MASK), 'Q') ); 00299 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_W, InputEvent::SHIFT_MASK), 'W') ); 00300 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_E, InputEvent::SHIFT_MASK), 'E') ); 00301 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_R, InputEvent::SHIFT_MASK), 'R') ); 00302 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_T, InputEvent::SHIFT_MASK), 'T') ); 00303 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_Y, InputEvent::SHIFT_MASK), 'Y') ); 00304 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_U, InputEvent::SHIFT_MASK), 'U') ); 00305 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_I, InputEvent::SHIFT_MASK), 'I') ); 00306 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_O, InputEvent::SHIFT_MASK), 'O') ); 00307 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_P, InputEvent::SHIFT_MASK), 'P') ); 00308 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_LBRACKET, InputEvent::SHIFT_MASK), '{') ); 00309 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_RBRACKET, InputEvent::SHIFT_MASK), '}') ); 00310 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_A, InputEvent::SHIFT_MASK), 'A') ); 00311 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_S, InputEvent::SHIFT_MASK), 'S') ); 00312 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_D, InputEvent::SHIFT_MASK), 'D') ); 00313 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_F, InputEvent::SHIFT_MASK), 'F') ); 00314 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_G, InputEvent::SHIFT_MASK), 'G') ); 00315 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_H, InputEvent::SHIFT_MASK), 'H') ); 00316 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_J, InputEvent::SHIFT_MASK), 'J') ); 00317 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_K, InputEvent::SHIFT_MASK), 'K') ); 00318 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_L, InputEvent::SHIFT_MASK), 'L') ); 00319 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_SEMICOLON, InputEvent::SHIFT_MASK), ':') ); 00320 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_APOSTROPHE, InputEvent::SHIFT_MASK), '"') ); 00321 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_GRAVE, InputEvent::SHIFT_MASK), '~') ); /* accent grave */ 00322 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_BACKSLASH, InputEvent::SHIFT_MASK), '|') ); 00323 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_Z, InputEvent::SHIFT_MASK), 'Z') ); 00324 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_X, InputEvent::SHIFT_MASK), 'X') ); 00325 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_C, InputEvent::SHIFT_MASK), 'C') ); 00326 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_V, InputEvent::SHIFT_MASK), 'V') ); 00327 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_B, InputEvent::SHIFT_MASK), 'B') ); 00328 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_N, InputEvent::SHIFT_MASK), 'N') ); 00329 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_M, InputEvent::SHIFT_MASK), 'M') ); 00330 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_COMMA, InputEvent::SHIFT_MASK), '<') ); 00331 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_PERIOD, InputEvent::SHIFT_MASK), '>') ); /* . on main keyboard */ 00332 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_SLASH, InputEvent::SHIFT_MASK), '?') ); /* '/' on main keyboard */ 00333 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_MULTIPLY, InputEvent::SHIFT_MASK), '*') ); /* * on numeric keypad */ 00334 sKeyChars.insert( KeyChars::value_type( KEYCODE(KC_SPACE, InputEvent::SHIFT_MASK), ' ') ); 00335 } 00336 }
Copyright © 2002-2003 by The OGRE Team
Last modified Wed Jan 21 00:10:14 2004