Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/merge/src/core/InputHandler.cc @ 1272

Last change on this file since 1272 was 1272, checked in by rgrieder, 16 years ago

merged input branch into merge branch

File size: 14.7 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Reto Grieder
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30 @file
31 @brief Implementation of the different input handlers.
32 */
33
34#include "InputHandler.h"
35#include "util/Convert.h"
36#include "Debug.h"
37#include "ConfigValueIncludes.h"
38#include "CoreIncludes.h"
39#include "CommandExecutor.h"
40
41namespace orxonox
42{
43  // ###############################
44  // ######     KeyBinder     ######
45  // ###############################
46
47  /**
48    @brief Constructor that does as little as necessary.
49  */
50  KeyBinder::KeyBinder()
51  {
52    RegisterObject(KeyBinder);
53    clearBindings();
54
55    std::string keyNames[] = {
56    "UNASSIGNED",
57    "ESCAPE",
58    "1",
59    "2",
60    "3",
61    "4",
62    "5",
63    "6",
64    "7",
65    "8",
66    "9",
67    "0",
68    "MINUS",
69    "EQUALS",
70    "BACK",
71    "TAB",
72    "Q",
73    "W",
74    "E",
75    "R",
76    "T",
77    "Y",
78    "U",
79    "I",
80    "O",
81    "P",
82    "LBRACKET",
83    "RBRACKET",
84    "RETURN",
85    "LCONTROL",
86    "A",
87    "S",
88    "D",
89    "F",
90    "G",
91    "H",
92    "J",
93    "K",
94    "L",
95    "SEMICOLON",
96    "APOSTROPHE",
97    "GRAVE",
98    "LSHIFT",
99    "BACKSLASH",
100    "Z",
101    "X",
102    "C",
103    "V",
104    "B",
105    "N",
106    "M",
107    "COMMA",
108    "PERIOD",
109    "SLASH",
110    "RSHIFT",
111    "MULTIPLY",
112    "LMENU",
113    "SPACE",
114    "CAPITAL",
115    "F1",
116    "F2",
117    "F3",
118    "F4",
119    "F5",
120    "F6",
121    "F7",
122    "F8",
123    "F9",
124    "F10",
125    "NUMLOCK",
126    "SCROLL",
127    "NUMPAD7",
128    "NUMPAD8",
129    "NUMPAD9",
130    "SUBTRACT",
131    "NUMPAD4",
132    "NUMPAD5",
133    "NUMPAD6",
134    "ADD",
135    "NUMPAD1",
136    "NUMPAD2",
137    "NUMPAD3",
138    "NUMPAD0",
139    "DECIMAL",
140    "","",
141    "OEM_102",
142    "F11",
143    "F12",
144    "","","","","","","","","","","",
145    "F13",
146    "F14",
147    "F15",
148    "","","","","","","","","","",
149    "KANA",
150    "","",
151    "ABNT_C1",
152    "","","","","",
153    "CONVERT",
154    "",
155    "NOCONVERT",
156    "",
157    "YEN",
158    "ABNT_C2",
159    "","","","","","","","","","","","","","",
160    "NUMPADEQUALS",
161    "","",
162    "PREVTRACK",
163    "AT",
164    "COLON",
165    "UNDERLINE",
166    "KANJI",
167    "STOP",
168    "AX",
169    "UNLABELED",
170    "NEXTTRACK",
171    "","",
172    "NUMPADENTER",
173    "RCONTROL",
174    "","",
175    "MUTE",
176    "CALCULATOR",
177    "PLAYPAUSE",
178    "",
179    "MEDIASTOP",
180    "","","","","","","","","",
181    "VOLUMEDOWN",
182    "",
183    "VOLUMEUP",
184    "",
185    "WEBHOME",
186    "NUMPADCOMMA",
187    "",
188    "DIVIDE",
189    "",
190    "SYSRQ",
191    "RMENU",
192    "","","","","","","","","","","","",
193    "PAUSE",
194    "",
195    "HOME",
196    "UP",
197    "PGUP",
198    "",
199    "LEFT",
200    "",
201    "RIGHT",
202    "",
203    "END",
204    "DOWN",
205    "PGDOWN",
206    "INSERT",
207    "DELETE",
208    "","","","","","","",
209    "LWIN",
210    "RWIN",
211    "APPS",
212    "POWER",
213    "SLEEP",
214    "","","",
215    "WAKE",
216    "",
217    "WEBSEARCH",
218    "WEBFAVORITES",
219    "WEBREFRESH",
220    "WEBSTOP",
221    "WEBFORWARD",
222    "WEBBACK",
223    "MYCOMPUTER",
224    "MAIL",
225    "MEDIASELECT"
226    };
227    for (int i = 0; i < numberOfKeys_s; i++)
228      keyNames_[i] = keyNames[i];
229
230    std::string mouseButtonNames[] = {
231      "MouseLeft", "MouseRight", "MouseMiddle",
232      "MouseButton3", "MouseButton4", "MouseButton5",
233      "MouseButton6", "MouseButton7" };
234    for (int i = 0; i < numberOfMouseButtons_s; i++)
235      mouseButtonNames_[i] = mouseButtonNames[i];
236
237    for (int i = 0; i < numberOfJoyStickButtons_s; i++)
238      joyStickButtonNames_[i] = "JoyStick" + getConvertedValue<int, std::string>(i);
239  }
240
241  /**
242    @brief Destructor
243  */
244  KeyBinder::~KeyBinder()
245  {
246  }
247
248  /**
249    @brief Loader for the key bindings, managed by config values.
250  */
251  void KeyBinder::setConfigValues()
252  {
253    ConfigValueContainer* cont;
254    std::string modes[] = {"P_", "R_", "H_"};
255
256    // keys
257    for (int i = 0; i < numberOfKeys_s; i++)
258    {
259      for (int j = 0; j < 3; j++)
260      {
261        cont = getIdentifier()->getConfigValueContainer(modes[j] + keyNames_[i]);
262        if (!cont)
263        {
264          cont = new ConfigValueContainer(CFT_Keybindings, getIdentifier(), modes[j] + keyNames_[i], "");
265          getIdentifier()->addConfigValueContainer(modes[j] + keyNames_[i], cont);
266        }
267        switch (j)
268        {
269          case 0:
270            cont->getValue(&bindingsKeyPress_[i].commandStr);
271            break;
272          case 1:
273            cont->getValue(&bindingsKeyRelease_[i].commandStr);
274            break;
275          case 2:
276            cont->getValue(&bindingsKeyHold_[i].commandStr);
277        }
278      }
279    }
280
281    // mouse buttons
282    for (int i = 0; i < numberOfMouseButtons_s; i++)
283    {
284      for (int j = 0; j < 3; j++)
285      {
286        cont = getIdentifier()->getConfigValueContainer(modes[j] + mouseButtonNames_[i]);
287        if (!cont)
288        {
289          cont = new ConfigValueContainer(CFT_Keybindings, getIdentifier(), modes[j] + mouseButtonNames_[i], "");
290          getIdentifier()->addConfigValueContainer(modes[j] + mouseButtonNames_[i], cont);
291        }
292        switch (j)
293        {
294          case 0:
295            cont->getValue(&bindingsMouseButtonPress_[i].commandStr);
296            break;
297          case 1:
298            cont->getValue(&bindingsMouseButtonRelease_[i].commandStr);
299            break;
300          case 2:
301            cont->getValue(&bindingsMouseButtonHold_[i].commandStr);
302        }
303      }
304    }
305
306    // joy stick buttons
307    for (int i = 0; i < numberOfJoyStickButtons_s; i++)
308    {
309      for (int j = 0; j < 3; j++)
310      {
311        cont = getIdentifier()->getConfigValueContainer(modes[j] + joyStickButtonNames_[i]);
312        if (!cont)
313        {
314          cont = new ConfigValueContainer(CFT_Keybindings, getIdentifier(), modes[j] + joyStickButtonNames_[i], "");
315          getIdentifier()->addConfigValueContainer(modes[j] + joyStickButtonNames_[i], cont);
316        }
317        switch (j)
318        {
319          case 0:
320            cont->getValue(&bindingsJoyStickButtonPress_[i].commandStr);
321            break;
322          case 1:
323            cont->getValue(&bindingsJoyStickButtonRelease_[i].commandStr);
324            break;
325          case 2:
326            cont->getValue(&bindingsJoyStickButtonHold_[i].commandStr);
327        }
328      }
329    }
330  }
331
332  /**
333    @brief Overwrites all bindings with ""
334  */
335  void KeyBinder::clearBindings()
336  {
337    for (int i = 0; i < numberOfKeys_s; i++)
338    {
339      bindingsKeyPress_  [i].commandStr = "";
340      bindingsKeyRelease_[i].commandStr = "";
341      bindingsKeyHold_   [i].commandStr = "";
342    }
343    for (int i = 0; i < numberOfMouseButtons_s; i++)
344    {
345      bindingsMouseButtonPress_  [i].commandStr = "";
346      bindingsMouseButtonRelease_[i].commandStr = "";
347      bindingsMouseButtonHold_   [i].commandStr = "";
348    }
349    for (int i = 0; i < numberOfJoyStickButtons_s; i++)
350    {
351      bindingsJoyStickButtonPress_  [i].commandStr = "";
352      bindingsJoyStickButtonRelease_[i].commandStr = "";
353      bindingsJoyStickButtonHold_   [i].commandStr = "";
354    }
355  }
356
357  /**
358    @brief Loads the key and button bindings.
359    @return True if loading succeeded.
360  */
361  bool KeyBinder::loadBindings()
362  {
363    COUT(ORX_DEBUG) << "KeyBinder: Loading key bindings..." << std::endl;
364
365    ConfigFileManager::getSingleton()->setFile(CFT_Keybindings, "keybindings.ini");
366    setConfigValues();
367
368    // evaluate the key bindings
369    // TODO: what if binding is invalid?
370    for (int i = 0; i < numberOfKeys_s; i++)
371    {
372      if (bindingsKeyPress_[i].commandStr != "")
373      {
374        bindingsKeyPress_[i].evaluation = CommandExecutor::evaluate(bindingsKeyPress_[i].commandStr);
375        bindingsKeyPress_[i].commandStr = bindingsKeyPress_[i].evaluation.getCommandString();
376      }
377    }
378
379    COUT(ORX_DEBUG) << "KeyBinder: Loading key bindings done." << std::endl;
380    return true;
381  }
382
383  bool KeyBinder::executeSimpleBinding(KeyBinding& binding)
384  {
385    if (binding.commandStr != "")
386    {
387      if (binding.commandStr != binding.evaluation.getCommandString())
388      {
389        // key binding has changed, reevaluate the command string.
390        binding.evaluation = CommandExecutor::evaluate(binding.commandStr);
391        binding.commandStr = binding.evaluation.getCommandString();
392      }
393      COUT(ORX_DEBUG) << "Keybinding: Executing command: " << binding.commandStr << std::endl;
394      CommandExecutor::execute(binding.commandStr);
395    }
396
397    return true;
398  }
399
400
401  /**
402    @brief Event handler for the keyPressed Event.
403    @param e Event information
404  */
405  bool KeyBinder::keyPressed(const KeyEvent& evt)
406  {
407    // find the appropriate key binding
408    executeSimpleBinding(bindingsKeyPress_[int(evt.key)]);
409
410    return true;
411  }
412
413  /**
414    @brief Event handler for the keyReleased Event.
415    @param e Event information
416  */
417  bool KeyBinder::keyReleased(const KeyEvent& evt)
418  {
419    // find the appropriate key binding
420    executeSimpleBinding(bindingsKeyRelease_[int(evt.key)]);
421
422    return true;
423  }
424
425  /**
426    @brief Event handler for the keyHeld Event.
427    @param e Mouse state information
428  */
429  bool KeyBinder::keyHeld(const KeyEvent& evt)
430  {
431    // find the appropriate key binding
432    executeSimpleBinding(bindingsKeyHold_[int(evt.key)]);
433
434    return true;
435  }
436
437  /**
438    @brief Event handler for the mouseMoved Event.
439    @param e Mouse state information
440  */
441  bool KeyBinder::mouseMoved(const MouseState &evt)
442  {
443    /*if (bindingMouseMoved_.commandStr != "")
444    {
445      if (bindingMouseMoved_.commandStr != bindingMouseMoved_.evaluation.getCommandString())
446      {
447        // key binding has changed, reevaluate the command string.
448        bindingMouseMoved_.evaluation = CommandExecutor::evaluate(bindingMouseMoved_.commandStr);
449        bindingMouseMoved_.commandStr = bindingMouseMoved_.evaluation.getCommandString();
450      }
451      COUT(3) << "Executing command: " << bindingMouseMoved_.commandStr << std::endl;
452
453      bindingMouseMoved_.evaluation.setEvaluatedParameter(
454      CommandExecutor::execute(bindingMouseMoved_.commandStr);
455    }*/
456
457    return true;
458  }
459
460  /**
461    @brief Event handler for the mouseScrolled Event.
462    @param e Mouse state information
463  */
464  bool KeyBinder::mouseScrolled(const MouseState &evt)
465  {
466    return true;
467  }
468
469  /**
470    @brief Event handler for the mousePressed Event.
471    @param e Event information
472    @param id The ID of the mouse button
473  */
474  bool KeyBinder::mouseButtonPressed(const MouseState& state, MouseButton::Enum id)
475  {
476    // find the appropriate key binding
477    executeSimpleBinding(bindingsMouseButtonPress_[int(id)]);
478
479    return true;
480  }
481
482  /**
483    @brief Event handler for the mouseReleased Event.
484    @param e Event information
485    @param id The ID of the mouse button
486  */
487  bool KeyBinder::mouseButtonReleased(const MouseState& state, MouseButton::Enum id)
488  {
489    // find the appropriate key binding
490    executeSimpleBinding(bindingsMouseButtonRelease_[int(id)]);
491
492    return true;
493  }
494
495  /**
496    @brief Event handler for the mouseHeld Event.
497    @param e Event information
498    @param id The ID of the mouse button
499  */
500  bool KeyBinder::mouseButtonHeld(const MouseState& state, MouseButton::Enum id)
501  {
502    // find the appropriate key binding
503    executeSimpleBinding(bindingsMouseButtonHold_[int(id)]);
504
505    return true;
506  }
507
508  bool KeyBinder::joyStickButtonPressed(const JoyStickState& state, int button)
509  {
510    // find the appropriate key binding
511    executeSimpleBinding(bindingsJoyStickButtonPress_[button]);
512
513    return true;
514  }
515
516  bool KeyBinder::joyStickButtonReleased(const JoyStickState& state, int button)
517  {
518    // find the appropriate key binding
519    executeSimpleBinding(bindingsJoyStickButtonRelease_[button]);
520
521    return true;
522  }
523
524  bool KeyBinder::joyStickButtonHeld(const JoyStickState& state, int button)
525  {
526    // find the appropriate key binding
527    executeSimpleBinding(bindingsJoyStickButtonHold_[button]);
528
529    return true;
530  }
531
532  bool KeyBinder::joyStickAxisMoved(const JoyStickState& state, int axis)
533  {
534    return true;
535  }
536
537  bool KeyBinder::joyStickSliderMoved(const JoyStickState& state, int index)
538  {
539    return true;
540  }
541
542  bool KeyBinder::joyStickPovMoved(const JoyStickState& state, int index)
543  {
544    return true;
545  }
546
547  bool KeyBinder::joyStickVector3Moved(const JoyStickState& state, int index)
548  {
549    return true;
550  }
551
552
553
554  // ###############################
555  // ###     GUIInputHandler     ###
556  // ###############################
557
558  ///**
559  //  @brief standard constructor
560  //*/
561  //GUIInputHandler::GUIInputHandler()
562  //{
563  //}
564
565  ///**
566  //  @brief Destructor
567  //*/
568  //GUIInputHandler::~GUIInputHandler()
569  //{
570  //}
571
572  ///**
573  //  @brief Event handler for the keyPressed Event.
574  //  @param e Event information
575  //*/
576  //bool GUIInputHandler::keyPressed(const OIS::KeyEvent &e)
577  //{
578    ////CEGUI::System::getSingleton().injectKeyDown( arg.key );
579    ////CEGUI::System::getSingleton().injectChar( arg.text );
580  //  return true;
581  //}
582
583  ///**
584  //  @brief Event handler for the keyReleased Event.
585  //  @param e Event information
586  //*/
587  //bool GUIInputHandler::keyReleased(const OIS::KeyEvent &e)
588  //{
589    ////CEGUI::System::getSingleton().injectKeyUp( arg.key );
590  //  return true;
591  //}
592
593  ///**
594  //  @brief Event handler for the mouseMoved Event.
595  //  @param e Event information
596  //*/
597  //bool GUIInputHandler::mouseMoved(const OIS::MouseEvent &e)
598  //{
599    ////CEGUI::System::getSingleton().injectMouseMove( arg.state.X.rel, arg.state.Y.rel );
600  //  return true;
601  //}
602
603  ///**
604  //  @brief Event handler for the mousePressed Event.
605  //  @param e Event information
606  //  @param id The ID of the mouse button
607  //*/
608  //bool GUIInputHandler::mousePressed(const OIS::MouseEvent &e, OIS::MouseButton id)
609  //{
610    ////CEGUI::System::getSingleton().injectMouseButtonDown(convertOISMouseButtonToCegui(id));
611  //  return true;
612  //}
613
614  ///**
615  //  @brief Event handler for the mouseReleased Event.
616  //  @param e Event information
617  //  @param id The ID of the mouse button
618  //*/
619  //bool GUIInputHandler::mouseReleased(const OIS::MouseEvent &e, OIS::MouseButton id)
620  //{
621    ////CEGUI::System::getSingleton().injectMouseButtonUp(convertOISMouseButtonToCegui(id));
622  //  return true;
623  //}
624
625}
Note: See TracBrowser for help on using the repository browser.