Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

OgreInput.cpp

Go to the documentation of this file.
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 Fri May 14 23:22:18 2004