00001 #include "InputHandler.h"
00002 #include "SelectableObject.h"
00003 #include "Application.h"
00004
00005
00006
00007 InputHandler::InputHandler(Ogre::RenderWindow* _window)
00008 {
00009
00010 OIS::ParamList paramList;
00011
00012 m_window = _window;
00013
00014 size_t windowHandle = 0;
00015 std::ostringstream windowHandleStr;
00016
00017 m_window->getCustomAttribute("WINDOW", &windowHandle);
00018 windowHandleStr << windowHandle;
00019 paramList.insert(std::make_pair(std::string("WINDOW"), windowHandleStr.str()));
00020
00021
00022 #if defined OIS_WIN32_PLATFORM
00023 paramList.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND" )));
00024 paramList.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE")));
00025 paramList.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_FOREGROUND")));
00026 paramList.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_NONEXCLUSIVE")));
00027 #elif defined OIS_LINUX_PLATFORM
00028 paramList.insert(std::make_pair(std::string("x11_mouse_grab"), std::string("false")));
00029 paramList.insert(std::make_pair(std::string("x11_mouse_hide"), std::string("false")));
00030 paramList.insert(std::make_pair(std::string("x11_keyboard_grab"), std::string("false")));
00031 paramList.insert(std::make_pair(std::string("XAutoRepeatOn"), std::string("true")));
00032 #endif
00033
00034 m_ois = OIS::InputManager::createInputSystem(paramList);
00035
00036 m_keyboard = static_cast<OIS::Keyboard*>(m_ois->createInputObject(OIS::OISKeyboard, true));
00037 m_keyboard->setEventCallback(this);
00038
00039 m_mouse = static_cast<OIS::Mouse*>(m_ois->createInputObject(OIS::OISMouse, true));
00040 m_mouse->setEventCallback(this);
00041
00042 setInputState(MENU);
00043
00044 m_rayOverlayQuery = Application::getSingleton()->getOverlayManager()->createRayQuery(Ogre::Ray());
00045 m_rayViewerQuery = Application::getSingleton()->getViewerManager()->createRayQuery(Ogre::Ray());
00046
00047 m_selected = 0;
00048
00049 }
00050
00051 InputHandler::~InputHandler()
00052 {
00053 if (m_keyboard) m_ois->destroyInputObject(m_keyboard);
00054 if (m_mouse) m_ois->destroyInputObject(m_mouse);
00055 OIS::InputManager::destroyInputSystem(m_ois);
00056 Application::getSingleton()->getOverlayManager()->destroyQuery(m_rayOverlayQuery);
00057 Application::getSingleton()->getViewerManager()->destroyQuery(m_rayViewerQuery);
00058 }
00059
00060 void InputHandler::getInput()
00061 {
00062 m_keyboard->capture();
00063 m_mouse->capture();
00064
00065
00066 if (getInputState() == VIEWER)
00067 {
00068 if ((Application::getSingleton()->getGameState() == RACING) || (Application::getSingleton()->getGameState() == RACE_START))
00069 {
00070 if (Ogre::any_cast<SelectableObject*>(&m_selected))
00071 {
00072 SelectableObject* selected;
00073 selected = Ogre::any_cast<SelectableObject*>(m_selected);
00074
00075 if (selected->getMoveable())
00076 {
00077 Ogre::Real speedVal = 1.0;
00078
00079 if (m_keyboard->isKeyDown(OIS::KC_LSHIFT)) speedVal = 5.0;
00080
00081 if (m_keyboard->isKeyDown(OIS::KC_A))
00082 {
00083 selected->getVector().x = -speedVal;
00084 }
00085
00086 if (m_keyboard->isKeyDown(OIS::KC_D))
00087 {
00088 selected->getVector().x = speedVal;
00089 }
00090
00091 if (m_keyboard->isKeyDown(OIS::KC_W))
00092 {
00093 selected->getVector().z = -speedVal;
00094 }
00095
00096 if (m_keyboard->isKeyDown(OIS::KC_S))
00097 {
00098 selected->getVector().z = speedVal;
00099 }
00100
00101 if (m_keyboard->isKeyDown(OIS::KC_Q))
00102 {
00103 selected->getVector().y = -speedVal;
00104 }
00105
00106 if (m_keyboard->isKeyDown(OIS::KC_E))
00107 {
00108 selected->getVector().y = speedVal;
00109 }
00110 }
00111 }
00112 }
00113 }
00114 }
00115
00116 void InputHandler::setWindowSize(int _width, int _height)
00117 {
00118 m_mouse->getMouseState().width = _width;
00119 m_mouse->getMouseState().height = _height;
00120 }
00121
00122 bool InputHandler::keyPressed(const OIS::KeyEvent &_event)
00123 {
00124
00125
00126
00127 return true;
00128 }
00129
00130 bool InputHandler::keyReleased(const OIS::KeyEvent &_event) {
00131
00132 if (_event.key == OIS::KC_ESCAPE)
00133 {
00134 Application::getSingleton()->setAppState(SHUTDOWN);
00135 }
00136
00137 if (_event.key == OIS::KC_R)
00138 {
00139 if (Ogre::any_cast<SelectableObject*>(&m_selected))
00140 {
00141 SelectableObject* selected;
00142 selected = Ogre::any_cast<SelectableObject*>(m_selected);
00143 selected->tryResetPosition();
00144 }
00145 }
00146
00147 return true;
00148 }
00149
00150 bool InputHandler::mouseMoved(const OIS::MouseEvent &_event)
00151 {
00152 const OIS::MouseState &mouse = m_mouse->getMouseState();
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181 if (getInputState() == MENU)
00182 {
00183 if (Application::getSingleton()->getGameState() == TRACK_EDITING)
00184 {
00185 if (mouse.buttonDown(OIS::MB_Left))
00186 {
00187 if (Ogre::any_cast<SelectableObject*>(&m_selected))
00188 {
00189 SelectableObject* selected;
00190 selected = Ogre::any_cast<SelectableObject*>(m_selected);
00191
00192 selected->getVector().x += mouse.X.rel;
00193 selected->getVector().y -= mouse.Y.rel;
00194 }
00195
00196 }
00197 }
00198
00199 }
00200
00201
00202
00203 return true;
00204 }
00205
00206 bool InputHandler::mousePressed(const OIS::MouseEvent &_event, OIS::MouseButtonID _button)
00207 {
00208
00209 if (getInputState() == MENU)
00210 {
00211
00212
00213
00214 const OIS::MouseState &mouse = m_mouse->getMouseState();
00215
00216 if(_button == OIS::MB_Left)
00217 {
00218
00219
00220 Ogre::Real x = mouse.X.abs / (Ogre::Real)mouse.width;
00221 Ogre::Real y = mouse.Y.abs / (Ogre::Real)mouse.height;
00222
00223 Ogre::Camera* oCamera = Application::getSingleton()->getCameraManager()->getCamera("OverlayCam")->getCamera();
00224 Ogre::Ray ray = oCamera->getCameraToViewportRay(x,y);
00225
00226 m_rayOverlayQuery->setRay(ray);
00227 m_rayOverlayQuery->setSortByDistance(true);
00228
00229 Ogre::RaySceneQueryResult &result = m_rayOverlayQuery->execute();
00230
00231 Ogre::RaySceneQueryResult::iterator iterator;
00232
00233
00234
00235 Ogre::Any oldSelected = m_preSelected;
00236 m_preSelected = 0;
00237
00238 for (iterator = result.begin(); iterator != result.end(); iterator++)
00239 {
00240 if (iterator->movable)
00241 {
00242
00243
00244 try
00245 {
00246 if (Ogre::any_cast<SelectableObject*>(&iterator->movable->getUserAny()))
00247 {
00248 SelectableObject* _selected = Ogre::any_cast<SelectableObject*>(iterator->movable->getUserAny());
00249 if (_selected->getMoveable())
00250 {
00251
00252
00253 _selected->setSelected(true);
00254 m_selected = _selected;
00255 m_preSelected = _selected;
00256 break;
00257 }
00258 }
00259 }
00260 catch (...)
00261 {
00262
00263 }
00264 }
00265 }
00266
00267 if (&oldSelected != &m_selected && &oldSelected != 0)
00268 {
00269 try
00270 {
00271 if (Ogre::any_cast<SelectableObject*>(&oldSelected))
00272 {
00273 SelectableObject* _selected = Ogre::any_cast<SelectableObject*>(oldSelected);
00274 _selected->setSelected(false);
00275 }
00276 }
00277 catch (...)
00278 {
00279
00280 }
00281 }
00282
00283 return true;
00284 }
00285
00286 }
00287 return true;
00288 }
00289
00290 bool InputHandler::mouseReleased(const OIS::MouseEvent &_event, OIS::MouseButtonID _button)
00291 {
00292
00293 if (getInputState() == MENU)
00294 {
00295
00296 if ((Application::getSingleton()->getGameState() == MENU_IDLE) || (Application::getSingleton()->getGameState() == TRACK_EDITING))
00297 {
00298 const OIS::MouseState &mouse = m_mouse->getMouseState();
00299
00300 if(_button == OIS::MB_Left)
00301 {
00302
00303
00304 Ogre::Real x = mouse.X.abs / (Ogre::Real)mouse.width;
00305 Ogre::Real y = mouse.Y.abs / (Ogre::Real)mouse.height;
00306
00307 Ogre::Camera* oCamera = Application::getSingleton()->getCameraManager()->getCamera("OverlayCam")->getCamera();
00308 Ogre::Ray ray = oCamera->getCameraToViewportRay(x,y);
00309
00310 m_rayOverlayQuery->setRay(ray);
00311 m_rayOverlayQuery->setSortByDistance(true);
00312
00313 Ogre::RaySceneQueryResult &result = m_rayOverlayQuery->execute();
00314
00315 Ogre::RaySceneQueryResult::iterator iterator;
00316
00317
00318
00319 Ogre::Any oldSelected = m_selected;
00320 m_selected = 0;
00321
00322 for (iterator = result.begin(); iterator != result.end(); iterator++)
00323 {
00324 if (iterator->movable)
00325 {
00326
00327
00328 try
00329 {
00330 if (Ogre::any_cast<SelectableObject*>(&iterator->movable->getUserAny()))
00331 {
00332 SelectableObject* _selected = Ogre::any_cast<SelectableObject*>(iterator->movable->getUserAny());
00333 if (_selected->getMoveable())
00334 {
00335 if (Ogre::any_cast<SelectableObject*>(m_preSelected) == _selected)
00336 {
00337 _selected->setSelected(true);
00338 m_selected = _selected;
00339 Application::getSingleton()->getGUI()->handleClick(_selected);
00340 }
00341 break;
00342 }
00343 }
00344 }
00345 catch (...)
00346 {
00347
00348 }
00349 }
00350 }
00351 m_preSelected = 0;
00352 if (&oldSelected != &m_selected && &oldSelected != 0)
00353 {
00354 try
00355 {
00356 if (Ogre::any_cast<SelectableObject*>(&oldSelected))
00357 {
00358 SelectableObject* _selected = Ogre::any_cast<SelectableObject*>(oldSelected);
00359 _selected->setSelected(false);
00360 }
00361 }
00362 catch (...)
00363 {
00364
00365 }
00366 }
00367
00368 return true;
00369 }
00370 }
00371 }
00372
00373 return true;
00374 }
00375
00376 void InputHandler::destroy(Ogre::RenderWindow* _window)
00377 {
00378 if(_window == m_window)
00379 {
00380 m_ois->destroyInputObject(m_mouse);
00381 m_ois->destroyInputObject(m_keyboard);
00382 OIS::InputManager::destroyInputSystem(m_ois);
00383 m_ois = 0;
00384 }
00385 }
00386
00387 inputState InputHandler::getInputState() {
00388 return m_inputState;
00389 }
00390
00391
00392 void InputHandler::setInputState(inputState _val) {
00393 m_inputState = _val;
00394 }
00395
00396
00397 void InputHandler::forceSelectCraft()
00398 {
00399 Ogre::Any oldSelected = m_selected;
00400 if (Ogre::any_cast<SelectableObject*>(&oldSelected))
00401 {
00402 SelectableObject* _selected = Ogre::any_cast<SelectableObject*>(oldSelected);
00403 _selected->setSelected(false);
00404 }
00405 m_selected = Application::getSingleton()->getObjectManager()->getCraftPtr();
00406 SelectableObject* _selected = Ogre::any_cast<SelectableObject*>(m_selected);
00407
00408 Camera* camera = Application::getSingleton()->getCameraManager()->getActiveCamera();
00409 camera->setFollowNode(_selected->getSceneNode());
00410
00411 setInputState(VIEWER);
00412 }