Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
May 19, 2008, 10:50:09 AM (17 years ago)
Author:
rgrieder
Message:

Basically, almost everything about the input management is written, but I wasn't yet able to test things.

Location:
code/branches/input/src/core
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • code/branches/input/src/core/CommandExecutor.cc

    r1214 r1323  
    3131#include "util/String.h"
    3232#include "util/Convert.h"
     33#include "util/SubString.h"
    3334#include "Identifier.h"
    3435#include "Language.h"
     
    173174    }
    174175
    175     KeybindMode CommandEvaluation::getKeybindMode()
     176    KeybindMode::Enum CommandEvaluation::getKeybindMode()
    176177    {
    177178        if (this->state_ == CS_Shortcut_Params || this->state_ == CS_Shortcut_Finished)
     
    198199        }
    199200        // FIXME: Had to insert a return statement
    200         return (KeybindMode)0;
     201        return (KeybindMode::Enum)0;
    201202    }
    202203
  • code/branches/input/src/core/CommandExecutor.h

    r1293 r1323  
    7070    std::string read(const std::string& filename);
    7171
    72     enum KeybindMode {}; // temporary
    73 
    7472    ///////////////////////
    7573    // CommandEvaluation //
     
    8280            CommandEvaluation();
    8381
    84             KeybindMode getKeybindMode();
     82            KeybindMode::Enum getKeybindMode();
    8583            bool isValid() const;
    8684
     
    8987            inline std::string getAdditionalParameter() const
    9088                { return (this->additionalParameter_ != "") ? (" " + this->additionalParameter_) : ""; }
    91             inline std::string getCommandString() const { return this->processedCommand_; }
     89            inline Executor* getExecutor() { return 0; }
    9290
    9391            void setEvaluatedParameter(unsigned int index, MultiTypeMath param);
  • code/branches/input/src/core/CorePrereqs.h

    r1293 r1323  
    7878#endif
    7979
     80  namespace KeybindMode
     81  {
     82    enum Enum
     83    {
     84      None,
     85      OnPress,
     86      OnHold,
     87      OnRelease
     88    };
     89  };
     90
    8091  typedef std::string LanguageEntryLabel;
    8192
  • code/branches/input/src/core/Executor.h

    r1062 r1323  
    233233            MultiTypeMath defaultValue_[MAX_FUNCTOR_ARGUMENTS];
    234234            bool bAddedDefaultValue_[MAX_FUNCTOR_ARGUMENTS];
     235            KeybindMode::Enum keybindMode_;
     236            int axisParameter_;
    235237
    236238        private:
  • code/branches/input/src/core/InputBuffer.cc

    r1293 r1323  
    173173  }
    174174
     175  /**
     176  * This tick() function is called by the InputManager if the InputBuffer is active.
     177  * @param dt Delta time
     178  */
    175179  void InputBuffer::tick(float dt)
    176180  {
  • code/branches/input/src/core/InputBuffer.h

    r1293 r1323  
    4343  {};
    4444
    45   class _CoreExport InputBuffer : public KeyHandler, public TickableReal
     45  class _CoreExport InputBuffer : public KeyHandler, public OrxonoxClass
    4646  {
    4747    struct InputBufferListenerTuple
  • code/branches/input/src/core/InputHandler.cc

    r1293 r1323  
    3434#include "InputHandler.h"
    3535#include "util/Convert.h"
     36#include "util/SubString.h"
     37#include "util/String.h"
    3638#include "Debug.h"
    3739#include "ConfigValueIncludes.h"
    3840#include "CoreIncludes.h"
    3941#include "CommandExecutor.h"
     42#include "Executor.h"
    4043
    4144namespace orxonox
     
    5154  {
    5255    RegisterObject(KeyBinder);
    53     clearBindings();
    54 
     56    clearBindings(true);
     57
     58    // keys
    5559    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"
     60      "UNASSIGNED",
     61      "ESCAPE",
     62      "1",
     63      "2",
     64      "3",
     65      "4",
     66      "5",
     67      "6",
     68      "7",
     69      "8",
     70      "9",
     71      "0",
     72      "MINUS",
     73      "EQUALS",
     74      "BACK",
     75      "TAB",
     76      "Q",
     77      "W",
     78      "E",
     79      "R",
     80      "T",
     81      "Y",
     82      "U",
     83      "I",
     84      "O",
     85      "P",
     86      "LBRACKET",
     87      "RBRACKET",
     88      "RETURN",
     89      "LCONTROL",
     90      "A",
     91      "S",
     92      "D",
     93      "F",
     94      "G",
     95      "H",
     96      "J",
     97      "K",
     98      "L",
     99      "SEMICOLON",
     100      "APOSTROPHE",
     101      "GRAVE",
     102      "LSHIFT",
     103      "BACKSLASH",
     104      "Z",
     105      "X",
     106      "C",
     107      "V",
     108      "B",
     109      "N",
     110      "M",
     111      "COMMA",
     112      "PERIOD",
     113      "SLASH",
     114      "RSHIFT",
     115      "MULTIPLY",
     116      "LMENU",
     117      "SPACE",
     118      "CAPITAL",
     119      "F1",
     120      "F2",
     121      "F3",
     122      "F4",
     123      "F5",
     124      "F6",
     125      "F7",
     126      "F8",
     127      "F9",
     128      "F10",
     129      "NUMLOCK",
     130      "SCROLL",
     131      "NUMPAD7",
     132      "NUMPAD8",
     133      "NUMPAD9",
     134      "SUBTRACT",
     135      "NUMPAD4",
     136      "NUMPAD5",
     137      "NUMPAD6",
     138      "ADD",
     139      "NUMPAD1",
     140      "NUMPAD2",
     141      "NUMPAD3",
     142      "NUMPAD0",
     143      "DECIMAL",
     144      "","",
     145      "OEM_102",
     146      "F11",
     147      "F12",
     148      "","","","","","","","","","","",
     149      "F13",
     150      "F14",
     151      "F15",
     152      "","","","","","","","","","",
     153      "KANA",
     154      "","",
     155      "ABNT_C1",
     156      "","","","","",
     157      "CONVERT",
     158      "",
     159      "NOCONVERT",
     160      "",
     161      "YEN",
     162      "ABNT_C2",
     163      "","","","","","","","","","","","","","",
     164      "NUMPADEQUALS",
     165      "","",
     166      "PREVTRACK",
     167      "AT",
     168      "COLON",
     169      "UNDERLINE",
     170      "KANJI",
     171      "STOP",
     172      "AX",
     173      "UNLABELED",
     174      "NEXTTRACK",
     175      "","",
     176      "NUMPADENTER",
     177      "RCONTROL",
     178      "","",
     179      "MUTE",
     180      "CALCULATOR",
     181      "PLAYPAUSE",
     182      "",
     183      "MEDIASTOP",
     184      "","","","","","","","","",
     185      "VOLUMEDOWN",
     186      "",
     187      "VOLUMEUP",
     188      "",
     189      "WEBHOME",
     190      "NUMPADCOMMA",
     191      "",
     192      "DIVIDE",
     193      "",
     194      "SYSRQ",
     195      "RMENU",
     196      "","","","","","","","","","","","",
     197      "PAUSE",
     198      "",
     199      "HOME",
     200      "UP",
     201      "PGUP",
     202      "",
     203      "LEFT",
     204      "",
     205      "RIGHT",
     206      "",
     207      "END",
     208      "DOWN",
     209      "PGDOWN",
     210      "INSERT",
     211      "DELETE",
     212      "","","","","","","",
     213      "LWIN",
     214      "RWIN",
     215      "APPS",
     216      "POWER",
     217      "SLEEP",
     218      "","","",
     219      "WAKE",
     220      "",
     221      "WEBSEARCH",
     222      "WEBFAVORITES",
     223      "WEBREFRESH",
     224      "WEBSTOP",
     225      "WEBFORWARD",
     226      "WEBBACK",
     227      "MYCOMPUTER",
     228      "MAIL",
     229      "MEDIASELECT"
    226230    };
    227     for (int i = 0; i < numberOfKeys_s; i++)
    228       keyNames_[i] = keyNames[i];
    229 
     231    for (int i = 0; i < nKeys_s; i++)
     232      namesKeys_[i] = "Key" + keyNames[i];
     233
     234    // mouse buttons
    230235    std::string mouseButtonNames[] = {
    231236      "MouseLeft", "MouseRight", "MouseMiddle",
    232237      "MouseButton3", "MouseButton4", "MouseButton5",
    233238      "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    for (int i = 0; i < nMouseButtons_s; i++)
     240      namesMouseButtons_[i] = mouseButtonNames[i];
     241
     242    // joy stick buttons
     243    for (int i = 0; i < 32; i++)
     244      namesJoyStickButtons_[i] = "JoyButton" + getConvertedValue<int, std::string>(i);
     245    for (int i = 32; i < nJoyStickButtons_s; i += 4)
     246    {
     247                  namesJoyStickButtons_[i + 0] = "JoyPOV" + getConvertedValue<int, std::string>((i - 32)/4 + 1) + "North";
     248                  namesJoyStickButtons_[i + 1] = "JoyPOV" + getConvertedValue<int, std::string>((i - 32)/4 + 1) + "South";
     249                  namesJoyStickButtons_[i + 2] = "JoyPOV" + getConvertedValue<int, std::string>((i - 32)/4 + 1) + "East";
     250                  namesJoyStickButtons_[i + 3] = "JoyPOV" + getConvertedValue<int, std::string>((i - 32)/4 + 1) + "West";
     251    }
     252
     253    // half axes
     254    std::string rawNames[nHalfAxes_s/2];
     255    rawNames[0] = "MouseX";
     256    rawNames[1] = "MouseY";
     257    rawNames[2] = "MouseWheel1";
     258    rawNames[3] = "MouseWheel2";
     259    for (unsigned int i = 4; i < nHalfAxes_s/2; i++)
     260      rawNames[i] = "JoyAxis" + getConvertedValue<int, std::string>(i - 3);
     261    for (unsigned int i = 0; i < nHalfAxes_s/2; i++)
     262    {
     263      namesHalfAxes_[i * 2 + 0] = rawNames[i] + "Pos";
     264      namesHalfAxes_[i * 2 + 1] = rawNames[i] + "Neg";
     265    }
    239266  }
    240267
     
    244271  KeyBinder::~KeyBinder()
    245272  {
     273    // almost no destructors required because most of the arrays are static.
     274    clearBindings(); // does some destruction work
    246275  }
    247276
     
    251280  void KeyBinder::setConfigValues()
    252281  {
    253     ConfigValueContainer* cont;
    254     std::string modes[] = {"P_", "R_", "H_"};
    255 
     282    bool success = true;
    256283    // 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 
     284    success |= readBindings(namesKeys_, bindingStringsKeys_, bindingsKeys_, nKeys_s);
    281285    // 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 
     286    success |= readBindings(namesMouseButtons_, bindingStringsMouseButtons_, bindingsMouseButtons_, nMouseButtons_s);
    306287    // 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     }
     288    success |= readBindings(namesJoyStickButtons_, bindingStringsJoyStickButtons_,
     289        bindingsJoyStickButtons_, nJoyStickButtons_s);
     290    // half axes
     291    success |= readBindings(namesHalfAxes_, bindingStringsHalfAxes_, bindingsHalfAxes_, nHalfAxes_s);
     292   
     293    // TODO: what happens if parsing didn't succeed in all parts? nothing?
     294  }
     295
     296  bool KeyBinder::readBindings(std::string* names, std::string* bindingStrings,
     297      KeyBindingBundle* bindings, unsigned int size)
     298  {
     299    for (unsigned int i = 0; i < size; i++)
     300    {
     301      // config value stuff
     302      ConfigValueContainer* cont = getIdentifier()->getConfigValueContainer(names[i]);
     303      if (!cont)
     304      {
     305        cont = new ConfigValueContainer(CFT_Keybindings, getIdentifier(), names[i], "");
     306        getIdentifier()->addConfigValueContainer(names[i], cont);
     307      }
     308      std::string old = bindingStrings[i];
     309      cont->getValue(&bindingStrings[i]);
     310
     311      // keybinder stuff
     312      if (old != bindingStrings[i])
     313      {
     314        // binding has changed
     315        if (bindingStrings[i] == "")
     316        {
     317          // empty binding, occurs at least the first time since init value is " "
     318          bindings[i].OnPress.clear();
     319          bindings[i].OnRelease.clear();
     320          bindings[i].OnHold.clear();
     321        }
     322        else
     323        {
     324          // actually parse the command(s)
     325          SubString commands(bindingStrings[i], "|", SubString::WhiteSpaces, false,
     326              '\\', false, '"', false, '(', ')', false, '\0');
     327          bindings[i].OnHold.nCommands = 0;
     328          bindings[i].OnHold.commands = new SimpleCommand[64];
     329          bindings[i].OnPress.nCommands = 0;
     330          bindings[i].OnPress.commands = new SimpleCommand[64];
     331          bindings[i].OnRelease.nCommands = 0;
     332          bindings[i].OnRelease.commands = new SimpleCommand[64];
     333          for (unsigned int iCommand = 0; iCommand < commands.size(); iCommand++)
     334          {
     335            if (commands[iCommand] != "")
     336            {
     337              SubString tokens(commands[iCommand], " ", SubString::WhiteSpaces, false,
     338                  '\\', false, '"', false, '(', ')', false, '\0');
     339             
     340              unsigned int iToken = 0;
     341
     342              // first argument can be OnPress, OnHold OnRelease or nothing
     343              KeybindMode::Enum mode = KeybindMode::None;
     344              if (getLowercase(tokens[iToken]) == "onpress")
     345                mode = KeybindMode::OnPress,   iToken++;
     346              if (getLowercase(tokens[iToken]) == "onrelease")
     347                mode = KeybindMode::OnRelease, iToken++;
     348              if (getLowercase(tokens[iToken]) == "onhold")
     349                mode = KeybindMode::OnHold,    iToken++;
     350
     351              if (iToken == tokens.size())
     352                continue;
     353
     354              SimpleCommand* cmd = new SimpleCommand();
     355
     356              // second argument can be the amplitude for the case it as an axis command
     357              // default amplitude is 1.0f
     358              if (getLowercase(tokens[iToken]) == "axisamp")
     359              {
     360                iToken++;
     361                float value;
     362                if (iToken == tokens.size() || !convertValue(&value, tokens[iToken]))
     363                {
     364                  CCOUT(2) << "Error while parsing key binding " << names[i]
     365                      << ". Numeric expression expected afer 'AxisAmp', switching to default value" << std::endl;
     366                  if (iToken == tokens.size())
     367                  {
     368                    delete cmd;
     369                    continue;
     370                  }
     371                  cmd->axisModifier = 1.0f;
     372                }
     373                else
     374                  cmd->axisModifier = value;
     375                iToken++;
     376              }
     377              else
     378                cmd->axisModifier = 1.0f;
     379
     380              // no more arguments expected except for the actual command
     381              if (iToken == tokens.size())
     382              { // no command given
     383                delete cmd;
     384                continue;
     385              }
     386              while (iToken != tokens.size())
     387                cmd->commandStr += tokens[iToken++] + " ";
     388
     389              // check whether we exceed 64 commands...
     390              if (bindings[i].OnHold.nCommands == 64 || bindings[i].OnPress.nCommands == 64
     391                  || bindings[i].OnRelease.nCommands == 64)
     392              {
     393                CCOUT(2) << "Error while parsing key binding " << names[i]
     394                    << ". You shouldn't assign more than 64 key bindings to one key "
     395                    << "just to test the parser" << std::endl;
     396              }
     397
     398              // evaluate the command
     399              cmd->axisCommand = 0;
     400              CommandEvaluation& eval = CommandExecutor::evaluate(cmd->commandStr);
     401              // TOOD: check for axis command
     402              if (false)
     403              {
     404                cmd->axisCommand->commandStr = cmd->commandStr;
     405                cmd->commandStr = "";
     406                cmd->axisCommand->evaluation = eval;
     407                // add command to the buffer if not yet existing
     408                for (unsigned int iAxisCmd = 0; iAxisCmd < axisCommands_.size(); iAxisCmd++)
     409                {
     410                  if (getLowercase(axisCommands_[iAxisCmd]->commandStr) == getLowercase(cmd->commandStr))
     411                  {
     412                    // already in list
     413                    cmd->axisCommand = axisCommands_[iAxisCmd];
     414                    break;
     415                  }
     416                }
     417                if (cmd->axisCommand == 0)
     418                {
     419                  cmd->axisCommand = new AxisCommand();
     420                  axisCommands_.push_back(cmd->axisCommand);
     421                }
     422                // TODO: check for relative/absolute command
     423                cmd->axisCommand->bRelative = false;
     424
     425                // axis commands are always OnHold
     426                *(bindings[i].OnHold.commands + bindings[i].OnHold.nCommands++) = *cmd;
     427              }
     428              else
     429              {
     430                cmd->evaluation = eval;
     431
     432                // TODO: determine whether the command is OnHold, OnPress or OnRelease
     433                switch (mode)
     434                {
     435                case KeybindMode::None:
     436                  *(bindings[i].OnPress.commands + bindings[i].OnPress.nCommands++) = *cmd;
     437                  break;
     438                case KeybindMode::OnPress:
     439                  *(bindings[i].OnPress.commands + bindings[i].OnPress.nCommands++) = *cmd;
     440                  break;
     441                case KeybindMode::OnHold:
     442                  *(bindings[i].OnHold.commands + bindings[i].OnHold.nCommands++) = *cmd;
     443                  break;
     444                case KeybindMode::OnRelease:
     445                  *(bindings[i].OnRelease.commands + bindings[i].OnRelease.nCommands++) = *cmd;
     446                  break;                     
     447                }
     448              }
     449            }
     450          }
     451
     452          // redimension arrays with simple commands
     453          SimpleCommand* sCmd = bindings[i].OnHold.commands;
     454          if (bindings[i].OnHold.nCommands)
     455          {
     456            bindings[i].OnHold.commands = new SimpleCommand[bindings[i].OnHold.nCommands];
     457            for (unsigned int iCmd = 0; iCmd < bindings[i].OnHold.nCommands; iCmd++)
     458              bindings[i].OnHold.commands[iCmd] = sCmd[iCmd];
     459          }
     460          else
     461            bindings[i].OnHold.commands = 0;
     462          delete[] sCmd;
     463
     464          sCmd = bindings[i].OnPress.commands;
     465          if (bindings[i].OnPress.nCommands)
     466          {
     467            bindings[i].OnPress.commands = new SimpleCommand[bindings[i].OnPress.nCommands];
     468            for (unsigned int iCmd = 0; iCmd < bindings[i].OnPress.nCommands; iCmd++)
     469              bindings[i].OnPress.commands[iCmd] = sCmd[iCmd];
     470          }
     471          else
     472            bindings[i].OnPress.commands = 0;
     473          delete[] sCmd;
     474
     475          sCmd = bindings[i].OnRelease.commands;
     476          if (bindings[i].OnRelease.nCommands)
     477          {
     478            bindings[i].OnRelease.commands = new SimpleCommand[bindings[i].OnRelease.nCommands];
     479            for (unsigned int iCmd = 0; iCmd < bindings[i].OnRelease.nCommands; iCmd++)
     480              bindings[i].OnRelease.commands[iCmd] = sCmd[iCmd];
     481          }
     482          else
     483            bindings[i].OnRelease.commands = 0;
     484          delete[] sCmd;
     485        }
     486      }
     487    }
     488    return true;
    330489  }
    331490
     
    333492    @brief Overwrites all bindings with ""
    334493  */
    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     }
     494  void KeyBinder::clearBindings(bool bInit)
     495  {
     496    for (int i = 0; i < nKeys_s; i++)
     497    {
     498      clearBundle(bindingsKeys_[i], bInit);
     499      bindingStringsKeys_[i] = " ";
     500    }
     501    for (int i = 0; i < nMouseButtons_s; i++)
     502    {
     503      clearBundle(bindingsMouseButtons_[i], bInit);
     504      bindingStringsMouseButtons_[i] = " ";
     505    }
     506    for (int i = 0; i < nJoyStickButtons_s; i++)
     507    {
     508      clearBundle(bindingsJoyStickButtons_[i], bInit);
     509      bindingStringsJoyStickButtons_[i] = " ";
     510    }
     511    for (int i = 0; i < nHalfAxes_s; i++)
     512    {
     513      clearBundle(bindingsHalfAxes_[i], bInit);
     514      bindingStringsHalfAxes_[i] = " ";
     515    }
     516    for (unsigned int i = 0; i < axisCommands_.size(); i++)
     517      delete axisCommands_[i];
     518    axisCommands_.clear();
     519  }
     520
     521  void KeyBinder::clearBundle(KeyBindingBundle& bundle, bool bInit)
     522  {
     523    if (!bInit)
     524    {
     525      if (bundle.OnHold.nCommands)
     526        delete[] bundle.OnHold.commands;
     527      if (bundle.OnPress.nCommands)
     528        delete[] bundle.OnPress.commands;
     529      if (bundle.OnRelease.nCommands)
     530        delete[] bundle.OnRelease.commands;
     531    }
     532    bundle.OnPress.nCommands = 0;
     533    bundle.OnHold.nCommands = 0;
     534    bundle.OnRelease.nCommands = 0;
    355535  }
    356536
     
    361541  bool KeyBinder::loadBindings()
    362542  {
    363     COUT(ORX_DEBUG) << "KeyBinder: Loading key bindings..." << std::endl;
     543    COUT(3) << "KeyBinder: Loading key bindings..." << std::endl;
     544
     545    // clear half axes
     546    for (unsigned int i = 0; i < nHalfAxes_s; i++)
     547    {
     548      halfAxes_[i].hasChanged = false;
     549      halfAxes_[i].abs = 0.0f;
     550      halfAxes_[i].rel = 0.0f;
     551      halfAxes_[i].wasDown = false;
     552      halfAxes_[i].threshold = 0.01f;
     553    }
    364554
    365555    ConfigFileManager::getSingleton()->setFile(CFT_Keybindings, "keybindings.ini");
     556    clearBindings();
    366557    setConfigValues();
    367558
    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 
     559    COUT(3) << "KeyBinder: Loading key bindings done." << std::endl;
     560    return true;
     561  }
     562
     563  void KeyBinder::tick(float dt)
     564  {
     565    // we have to process all the analog input since there is e.g. no 'mouseDoesntMove' event.
     566    for (unsigned int i = 0; i < nHalfAxes_s; i++)
     567    {
     568      if (!halfAxes_[i].hasChanged)
     569      {
     570        if (!halfAxes_[i].wasDown && halfAxes_[i].abs > halfAxes_[i].threshold)
     571        {
     572          halfAxes_[i].wasDown = true;
     573          if (bindingsHalfAxes_[i].OnPress.nCommands)
     574            executeBinding(bindingsHalfAxes_[i].OnPress, halfAxes_[i].rel, halfAxes_[i].abs);
     575        }
     576        else if (halfAxes_[i].wasDown && halfAxes_[i].abs < halfAxes_[i].threshold)
     577        {
     578          halfAxes_[i].wasDown = false;
     579          if (bindingsHalfAxes_[i].OnRelease.nCommands)
     580            executeBinding(bindingsHalfAxes_[i].OnRelease, halfAxes_[i].rel, halfAxes_[i].abs);
     581        }
     582        if (halfAxes_[i].wasDown)
     583        {
     584          executeBinding(bindingsHalfAxes_[i].OnHold, halfAxes_[i].rel, halfAxes_[i].abs);
     585        }
     586        halfAxes_[i].hasChanged = false;
     587      }
     588    }
     589
     590    // execute all buffered bindings (addional parameter)
     591    for (unsigned int i = 0; i < axisCommands_.size(); i++)
     592    {
     593      if (axisCommands_[i]->nValuesAdded > 0)
     594      {
     595        axisCommands_[i]->evaluation.setEvaluatedParameter(0, axisCommands_[i]->value);
     596        // reset
     597        axisCommands_[i]->nValuesAdded = 0;
     598        axisCommands_[i]->value = 0.0f;
     599      }
     600    }
     601  }
     602
     603  bool KeyBinder::executeBinding(KeyBinding& binding, float axisRel, float axisAbs)
     604  {
     605    // execute all the parsed commands in the string
     606    for (unsigned int iCommand = 0; iCommand < binding.nCommands; iCommand++)
     607    {
     608      SimpleCommand& command = binding.commands[iCommand];
     609      if (command.axisCommand)
     610      {
     611        AxisCommand& axisCommand = *command.axisCommand;
     612        // command has an additional parameter
     613        if (command.axisCommand->bRelative)
     614        {
     615          // we have to calculate a relative movement.
     616          // amplitude says how much one keystroke is
     617          axisCommand.value += command.axisModifier * axisRel;
     618        }
     619        else
     620        {
     621          // we have to calculate absolute position of the axis.
     622          // for a key this simply is 1, but multiplied by a user defined factor
     623          // since there might be another axis that is affected, we have to wait and
     624          // store the result in a temporary place
     625          axisCommand.value =
     626              (axisCommand.value * (axisCommand.nValuesAdded++) + command.axisModifier * axisAbs)
     627              / axisCommand.nValuesAdded;
     628        }
     629      }
     630      else
     631      {
     632        // simple command, just execute directly
     633        // TODO: calculate whether this a Press, Release or Hold event
     634        CommandExecutor::execute(command.evaluation);
     635      }
     636    }
    397637    return true;
    398638  }
     
    406646  {
    407647    // find the appropriate key binding
    408     executeSimpleBinding(bindingsKeyPress_[int(evt.key)]);
     648    executeBinding(bindingsKeys_[int(evt.key)].OnPress, 1.0, 1.0);
    409649
    410650    return true;
     
    418658  {
    419659    // find the appropriate key binding
    420     executeSimpleBinding(bindingsKeyRelease_[int(evt.key)]);
     660    executeBinding(bindingsKeys_[int(evt.key)].OnRelease, 1.0, 1.0);
    421661
    422662    return true;
     
    430670  {
    431671    // find the appropriate key binding
    432     executeSimpleBinding(bindingsKeyHold_[int(evt.key)]);
     672    executeBinding(bindingsKeys_[int(evt.key)].OnHold, 1.0, 1.0);
    433673
    434674    return true;
     
    439679    @param e Mouse state information
    440680  */
    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     }*/
     681  bool KeyBinder::mouseMoved(IntVector2 abs, IntVector2 rel, IntVector2 clippingSize)
     682  {
     683    halfAxes_[0].hasChanged = true;
     684    halfAxes_[1].hasChanged = true;
     685    halfAxes_[2].hasChanged = true;
     686    halfAxes_[3].hasChanged = true;
     687    // translate absolute mouse position into joystick like behaviour
     688    if (clippingSize.x > clippingSize.y)
     689    {
     690      int margin = (clippingSize.x - clippingSize.y) / 2;
     691      if (abs.x - margin > clippingSize.y)
     692      {
     693        halfAxes_[0].abs = 1.0f;
     694        halfAxes_[1].abs = 0.0f;
     695      }
     696      else if (abs.x < margin)
     697      {
     698        halfAxes_[0].abs = 0.0f;
     699        halfAxes_[1].abs = 1.0f;
     700      }
     701      else
     702      {
     703        float temp = ((float)abs.x) / clippingSize.y * 2 - 1;
     704        if (temp > 0)
     705        {
     706          halfAxes_[0].abs = temp;
     707          halfAxes_[1].abs = 0.0f;
     708        }
     709        else
     710        {
     711          halfAxes_[0].abs = 0.0f;
     712          halfAxes_[1].abs = -temp;
     713        }
     714      }
     715
     716      float temp = -((float)abs.y) / clippingSize.y * 2 + 1;
     717      if (temp > 0)
     718      {
     719        halfAxes_[2].abs = temp;
     720        halfAxes_[3].abs = 0.0;
     721      }
     722      else
     723      {
     724        halfAxes_[2].abs = 0.0;
     725        halfAxes_[3].abs = -temp;
     726      }
     727    }
     728    else
     729    {
     730      float temp = ((float)abs.x) / clippingSize.x * 2 - 1;
     731      if (temp > 0)
     732      {
     733        halfAxes_[0].abs = temp;
     734        halfAxes_[1].abs = 0.0;
     735      }
     736      else
     737      {
     738        halfAxes_[0].abs = 0.0;
     739        halfAxes_[1].abs = -temp;
     740      }
     741
     742      int margin = (clippingSize.y - clippingSize.x) / 2;
     743      if (abs.y - margin > clippingSize.x)
     744      {
     745        halfAxes_[2].abs = 0.0;
     746        halfAxes_[3].abs = 1.0;
     747      }
     748      else if (abs.y < margin)
     749      {
     750        halfAxes_[2].abs = 1.0;
     751        halfAxes_[3].abs = 0.0;
     752      }
     753      else
     754      {
     755        float temp = -((float)abs.y) / clippingSize.x * 2 + 1;
     756        if (temp > 0)
     757        {
     758          halfAxes_[2].abs = temp;
     759          halfAxes_[3].abs = 0.0;
     760        }
     761        else
     762        {
     763          halfAxes_[2].abs = 0.0;
     764          halfAxes_[3].abs = -temp;
     765        }
     766      }
     767    }
     768   
     769    // relative movements
     770    if (rel.x > 0)
     771    {
     772      halfAxes_[0].rel = rel.x;
     773      halfAxes_[1].rel = 0.0;
     774    }
     775    else
     776    {
     777      halfAxes_[0].rel = 0.0;
     778      halfAxes_[1].rel = rel.x;
     779    }
     780
     781    if (rel.y /*!*/ < /*!*/ 0)
     782    {
     783      halfAxes_[0].rel = -rel.y;
     784      halfAxes_[1].rel = 0.0;
     785    }
     786    else
     787    {
     788      halfAxes_[0].rel = 0.0;
     789      halfAxes_[1].rel = -rel.y;
     790    }
    456791
    457792    return true;
     
    462797    @param e Mouse state information
    463798  */
    464   bool KeyBinder::mouseScrolled(const MouseState &evt)
    465   {
     799  bool KeyBinder::mouseScrolled(int abs, int rel)
     800  {
     801    // TODO: obvious...
    466802    return true;
    467803  }
     
    472808    @param id The ID of the mouse button
    473809  */
    474   bool KeyBinder::mouseButtonPressed(const MouseState& state, MouseButton::Enum id)
     810  bool KeyBinder::mouseButtonPressed(MouseButton::Enum id)
    475811  {
    476812    // find the appropriate key binding
    477     executeSimpleBinding(bindingsMouseButtonPress_[int(id)]);
     813    executeBinding(bindingsMouseButtons_[int(id)].OnPress, 1.0, 1.0);
    478814
    479815    return true;
     
    485821    @param id The ID of the mouse button
    486822  */
    487   bool KeyBinder::mouseButtonReleased(const MouseState& state, MouseButton::Enum id)
     823  bool KeyBinder::mouseButtonReleased(MouseButton::Enum id)
    488824  {
    489825    // find the appropriate key binding
    490     executeSimpleBinding(bindingsMouseButtonRelease_[int(id)]);
     826    executeBinding(bindingsMouseButtons_[int(id)].OnRelease, 1.0, 1.0);
    491827
    492828    return true;
     
    498834    @param id The ID of the mouse button
    499835  */
    500   bool KeyBinder::mouseButtonHeld(const MouseState& state, MouseButton::Enum id)
     836  bool KeyBinder::mouseButtonHeld(MouseButton::Enum id)
    501837  {
    502838    // 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)
     839    executeBinding(bindingsMouseButtons_[int(id)].OnHold, 1.0, 1.0);
     840
     841    return true;
     842  }
     843
     844  bool KeyBinder::joyStickButtonPressed(int joyStickID, int button)
    509845  {
    510846    // find the appropriate key binding
    511     executeSimpleBinding(bindingsJoyStickButtonPress_[button]);
    512 
    513     return true;
    514   }
    515 
    516   bool KeyBinder::joyStickButtonReleased(const JoyStickState& state, int button)
     847    executeBinding(bindingsJoyStickButtons_[button].OnPress, 1.0, 1.0);
     848
     849    return true;
     850  }
     851
     852  bool KeyBinder::joyStickButtonReleased(int joyStickID, int button)
    517853  {
    518854    // find the appropriate key binding
    519     executeSimpleBinding(bindingsJoyStickButtonRelease_[button]);
    520 
    521     return true;
    522   }
    523 
    524   bool KeyBinder::joyStickButtonHeld(const JoyStickState& state, int button)
     855    executeBinding(bindingsJoyStickButtons_[button].OnRelease, 1.0, 1.0);
     856
     857    return true;
     858  }
     859
     860  bool KeyBinder::joyStickButtonHeld(int joyStickID, int button)
    525861  {
    526862    // 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 
     863    executeBinding(bindingsJoyStickButtons_[button].OnHold, 1.0, 1.0);
     864
     865    return true;
     866  }
     867
     868  bool KeyBinder::joyStickAxisMoved(int joyStickID, int axis, int value)
     869  {
     870    // TODO: check whether 16 bit integer as general axis value is a good idea (works under windows)
     871    halfAxes_[8 + axis].hasChanged = true;
     872    if (value >= 0)
     873    {
     874      halfAxes_[8 + axis].abs = ((float)value)/0x1000;
     875      halfAxes_[8 + axis].hasChanged = true;
     876    }
     877    else
     878    {
     879      halfAxes_[8 + axis + 1].abs = -((float)value)/0x1000;
     880      halfAxes_[8 + axis + 1].hasChanged = true;
     881    }
     882    return true;
     883  }
    552884
    553885
  • code/branches/input/src/core/InputHandler.h

    r1293 r1323  
    4040
    4141#include "ois/OIS.h"
     42#include "util/Math.h"
    4243#include "OrxonoxClass.h"
    4344#include "CommandExecutor.h"
     
    4647namespace orxonox
    4748{
    48   namespace KeybindSetting
    49   {
    50     enum KeybindSetting
    51     {
    52       None,
    53       OnPress,
    54       OnRelease,
    55       Continuous,
    56     };
    57   }
    58 
    59   struct _CoreExport KeyBinding
     49  struct _CoreExport AxisCommand
    6050  {
    6151    std::string commandStr;
    6252    CommandEvaluation evaluation;
    63   };
    64  
     53    bool bRelative;
     54    float value;
     55    unsigned int nValuesAdded;
     56  };
     57
     58  struct _CoreExport SimpleCommand
     59  {
     60    // for simple binding; direct
     61    std::string commandStr;
     62    CommandEvaluation evaluation;
     63
     64    // axis binding; buffered
     65    AxisCommand* axisCommand;
     66    float axisModifier;
     67  };
     68
     69  struct _CoreExport KeyBinding
     70  {
     71    void clear() { commands = 0; nCommands = 0; }
     72    SimpleCommand* commands;
     73    unsigned int nCommands;
     74  };
     75
     76  struct _CoreExport KeyBindingBundle
     77  {
     78    KeyBinding OnPress;
     79    KeyBinding OnRelease;
     80    KeyBinding OnHold;
     81  };
     82
     83  struct _CoreExport HalfAxis
     84  {
     85    float rel;
     86    float abs;
     87    float threshold;
     88    bool wasDown;
     89    bool hasChanged;
     90  };
     91
    6592
    6693  /**
     
    75102
    76103    bool loadBindings();
    77     void clearBindings();
     104    void clearBindings(bool bInit = false);
    78105
    79106    void setConfigValues();
    80107
    81108  private: // functions
    82 
    83     bool executeSimpleBinding(KeyBinding &binding);
     109    bool readBindings(std::string* names, std::string* bindingStrings, KeyBindingBundle* bindings, unsigned int size);
     110    bool executeBinding(KeyBinding& binding, float axisRel, float axisAbs);
     111    void clearBundle(KeyBindingBundle& bundle, bool bInit);
     112
     113    void tick(float dt);
    84114
    85115    bool keyPressed (const KeyEvent& evt);
     
    87117    bool keyHeld    (const KeyEvent& evt);
    88118
    89     bool mouseButtonPressed (const MouseState& state, MouseButton::Enum id);
    90     bool mouseButtonReleased(const MouseState& state, MouseButton::Enum id);
    91     bool mouseButtonHeld    (const MouseState& state, MouseButton::Enum id);
    92     bool mouseMoved         (const MouseState& state);
    93     bool mouseScrolled      (const MouseState& state);
    94 
    95     bool joyStickButtonPressed (const JoyStickState& state, int button);
    96     bool joyStickButtonReleased(const JoyStickState& state, int button);
    97     bool joyStickButtonHeld    (const JoyStickState& state, int button);
    98     bool joyStickAxisMoved     (const JoyStickState& state, int axis)  ;
    99     bool joyStickSliderMoved   (const JoyStickState& state, int index) ;
    100     bool joyStickPovMoved      (const JoyStickState& state, int index) ;
    101     bool joyStickVector3Moved  (const JoyStickState& state, int index) ;
     119    bool mouseButtonPressed (MouseButton::Enum id);
     120    bool mouseButtonReleased(MouseButton::Enum id);
     121    bool mouseButtonHeld    (MouseButton::Enum id);
     122    bool mouseMoved         (IntVector2 abs, IntVector2 rel, IntVector2 clippingSize);
     123    bool mouseScrolled      (int abs, int rel);
     124
     125    bool joyStickButtonPressed (int joyStickID, int button);
     126    bool joyStickButtonReleased(int joyStickID, int button);
     127    bool joyStickButtonHeld    (int joyStickID, int button);
     128    bool joyStickAxisMoved     (int joyStickID, int axis, int value)  ;
    102129
    103130  private: // variables
    104 
    105131    //! denotes the number of different keys there are in OIS.
    106     static const int numberOfKeys_s = 0xEE;
    107     //! Array of input events for every pressed key
    108     KeyBinding bindingsKeyPress_  [numberOfKeys_s];
    109     //! Array of input events for every released key
    110     KeyBinding bindingsKeyRelease_[numberOfKeys_s];
    111     //! Array of input events for every held key
    112     KeyBinding bindingsKeyHold_   [numberOfKeys_s];
     132    static const unsigned int nKeys_s = 0xEE;
     133    //! Actual key bindings as bundle for Press, Hold and Release
     134    KeyBindingBundle bindingsKeys_ [nKeys_s];
    113135    //! Names of the keys as strings
    114     std::string keyNames_[numberOfKeys_s];
     136    std::string namesKeys_         [nKeys_s];
     137    //! The configured string values
     138    std::string bindingStringsKeys_[nKeys_s];
    115139
    116140    //! denotes the number of different mouse buttons there are in OIS.
    117     static const int numberOfMouseButtons_s = 8;
    118     //! Array of input events for every pressed mouse button
    119     KeyBinding bindingsMouseButtonPress_  [numberOfMouseButtons_s];
    120     //! Array of input events for every released mouse button
    121     KeyBinding bindingsMouseButtonRelease_[numberOfMouseButtons_s];
    122     //! Array of input events for every held mouse button
    123     KeyBinding bindingsMouseButtonHold_   [numberOfMouseButtons_s];
    124     //! Key binding for mouse moved event
    125     KeyBinding bindingMouseMoved_;
    126     //! Key binding for mouse scrolled event
    127     KeyBinding bindingMouseScrolled_;
     141    static const unsigned int nMouseButtons_s = 8;
     142    //! Actual key bindings as bundle for Press, Hold and Release
     143    KeyBindingBundle bindingsMouseButtons_ [nMouseButtons_s];
    128144    //! Names of the mouse buttons as strings
    129     std::string mouseButtonNames_[numberOfMouseButtons_s];
     145    std::string namesMouseButtons_         [nMouseButtons_s];
     146    //! The configured string values
     147    std::string bindingStringsMouseButtons_[nMouseButtons_s];
    130148
    131149    //! denotes the number of different joy stick buttons there are in OIS.
    132     static const int numberOfJoyStickButtons_s = 32;
    133     //! Array of input events for every pressed joy stick button
    134     KeyBinding bindingsJoyStickButtonPress_  [numberOfJoyStickButtons_s];
    135     //! Array of input events for every released joy stick button
    136     KeyBinding bindingsJoyStickButtonRelease_[numberOfJoyStickButtons_s];
    137     //! Array of input events for every held joy stick button
    138     KeyBinding bindingsJoyStickButtonHold_   [numberOfJoyStickButtons_s];
     150    static const unsigned int nJoyStickButtons_s = 32 + 4 * 4; // 32 buttons and 4 POVs with 4 buttons
     151    //! Actual key bindings as bundle for Press, Hold and Release
     152    KeyBindingBundle bindingsJoyStickButtons_ [nJoyStickButtons_s];
    139153    //! Names of the joy stick buttons as strings
    140     std::string joyStickButtonNames_[numberOfJoyStickButtons_s];
    141 
     154    std::string namesJoyStickButtons_         [nJoyStickButtons_s];
     155    //! The configured string values
     156    std::string bindingStringsJoyStickButtons_[nJoyStickButtons_s];
     157
     158    //! denotes the number of half axes (every axis twice) there can be.
     159    static const unsigned int nHalfAxes_s = 56;
     160    /**
     161    * Array with all the half axes for mouse and joy sticks.
     162    * Bear in mind that the positions are fixed and that the first entry is the
     163    * positive one and the second is negative.
     164    * Sequence is as follows:
     165    *  0 -  3: Mouse x and y
     166    *  4 -  7: Mouse scroll wheels 1 and 2 (2 not yet supported)
     167    *  8 - 23: joy stick (slider) axes 1 to 8
     168    * 24 - 55: joy stick axes 1 - 16
     169    */
     170    HalfAxis halfAxes_[nHalfAxes_s];
     171    //! Actual key bindings as bundle for Press, Hold and Release
     172    KeyBindingBundle bindingsHalfAxes_ [nHalfAxes_s];
     173    //! Names of the half axes
     174    std::string namesHalfAxes_         [nHalfAxes_s];
     175    //! The configured string values
     176    std::string bindingStringsHalfAxes_[nHalfAxes_s];
     177
     178    /**
     179    * Commands that have additional parameters (axes) are executed at the end of
     180    * the tick() so that all values can be buffered for single execution.
     181    */
     182    std::vector<AxisCommand*> axisCommands_;
    142183  };
    143184
  • code/branches/input/src/core/InputInterfaces.h

    r1293 r1323  
    3838
    3939#include "ois/OIS.h"
     40#include "util/Math.h"
    4041
    4142namespace orxonox
     
    239240  };
    240241
    241   typedef OIS::MouseState MouseState;
    242 
    243   class _CoreExport JoyStickState : OIS::JoyStickState
     242  //typedef OIS::MouseState MouseState;
     243
     244  /*class _CoreExport JoyStickState
    244245  {
    245246  public:
     
    247248    JoyStickState() { clear(); }
    248249    int mJoyStickID;
     250                JoyStickState() { clear(); }
     251
     252                std::vector<bool> mButtons;
     253                int axes[16];
     254                std::vector<Vector3> mVectors;
     255  };*/
     256
     257  class _CoreExport InputTickable
     258  {
     259  public:
     260    virtual ~InputTickable() { }
     261    virtual void tick(float dt) = 0;
    249262  };
    250263
     
    252265    @brief Interface class used for key input listeners.
    253266  */
    254   class _CoreExport KeyHandler
     267  class _CoreExport KeyHandler : virtual public InputTickable
    255268  {
    256269  public:
     
    264277    @brief Interface class used for mouse input listeners.
    265278  */
    266   class _CoreExport MouseHandler
     279  class _CoreExport MouseHandler : virtual public InputTickable
    267280  {
    268281  public:
    269282    virtual ~MouseHandler() { }
    270     virtual bool mouseButtonPressed (const MouseState& state, MouseButton::Enum id) = 0;
    271     virtual bool mouseButtonReleased(const MouseState& state, MouseButton::Enum id) = 0;
    272     virtual bool mouseButtonHeld    (const MouseState& state, MouseButton::Enum id) = 0;
    273     virtual bool mouseMoved         (const MouseState& state) = 0;
    274     virtual bool mouseScrolled      (const MouseState& state) = 0;
     283    virtual bool mouseButtonPressed (MouseButton::Enum id) = 0;
     284    virtual bool mouseButtonReleased(MouseButton::Enum id) = 0;
     285    virtual bool mouseButtonHeld    (MouseButton::Enum id) = 0;
     286    virtual bool mouseMoved         (IntVector2 abs, IntVector2 rel, IntVector2 clippingSize) = 0;
     287    virtual bool mouseScrolled      (int abs, int rel)    = 0;
    275288  };
    276289
     
    279292    @brief Interface class used for joy stick input listeners.
    280293  */
    281   class _CoreExport JoyStickHandler
     294  class _CoreExport JoyStickHandler : virtual public InputTickable
    282295  {
    283296  public:
    284297    virtual ~JoyStickHandler() { }
    285     virtual bool joyStickButtonPressed (const JoyStickState& state, int button) = 0;
    286     virtual bool joyStickButtonReleased(const JoyStickState& state, int button) = 0;
    287     virtual bool joyStickButtonHeld    (const JoyStickState& state, int button) = 0;
    288     virtual bool joyStickAxisMoved     (const JoyStickState& state, int axis)   = 0;
    289     virtual bool joyStickSliderMoved   (const JoyStickState& state, int index) {return true;}
    290     virtual bool joyStickPovMoved      (const JoyStickState& state, int index) {return true;}
    291     virtual bool joyStickVector3Moved  (const JoyStickState& state, int index) {return true;}
     298    virtual bool joyStickButtonPressed (int joyStickID, int button) = 0;
     299    virtual bool joyStickButtonReleased(int joyStickID, int button) = 0;
     300    virtual bool joyStickButtonHeld    (int joyStickID, int button) = 0;
     301    virtual bool joyStickAxisMoved     (int joyStickID, int axis, int value) = 0;
     302    //virtual bool joyStickVector3Moved  (int joyStickID, int index /*, fill list*/) {return true;}
    292303  };
    293304
  • code/branches/input/src/core/InputManager.cc

    r1293 r1323  
    267267    activeJoyStickHandlers_.resize(joySticksSize_);
    268268    joyStickButtonsDown_.resize(joySticksSize_);
     269    povStates_.resize(joySticksSize_);
     270    sliderStates_.resize(joySticksSize_);
    269271    return success;
    270272  }
     
    348350    }
    349351    CCOUT(ORX_DEBUG) << "Joy sticks destroyed." << std::endl;
     352  }
     353
     354  void InputManager::_updateTickables()
     355  {
     356    // we can use a set to have a list of unique pointers (an object can implement all 3 handlers)
     357    std::set<InputTickable*> tempSet;
     358    for (unsigned int iHandler = 0; iHandler < activeKeyHandlers_.size(); iHandler++)
     359      tempSet.insert(activeKeyHandlers_[iHandler]);
     360    for (unsigned int iHandler = 0; iHandler < activeMouseHandlers_.size(); iHandler++)
     361      tempSet.insert(activeMouseHandlers_[iHandler]);
     362    for (unsigned int iJoyStick  = 0; iJoyStick < joySticksSize_; iJoyStick++)
     363      for (unsigned int iHandler = 0; iHandler  < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
     364        tempSet.insert(activeJoyStickHandlers_[iJoyStick][iHandler]);
     365
     366    // copy the content of the set back to the actual vector
     367    activeHandlers_.clear();
     368    for (std::set<InputTickable*>::const_iterator itHandler = tempSet.begin(); itHandler != tempSet.end(); itHandler++)
     369      activeHandlers_.push_back(*itHandler);
    350370  }
    351371
     
    389409
    390410        case IS_GUI:
    391           // FIXME: do stuff
     411          // TODO: do stuff
    392412          break;
    393413
     
    426446    for (unsigned int iButton = 0; iButton < mouseButtonsDown_.size(); iButton++)
    427447      for (unsigned int iHandler = 0; iHandler < activeMouseHandlers_.size(); iHandler++)
    428         activeMouseHandlers_[iHandler]->mouseButtonHeld(mouse_->getMouseState(), mouseButtonsDown_[iButton]);
     448        activeMouseHandlers_[iHandler]->mouseButtonHeld(mouseButtonsDown_[iButton]);
    429449
    430450    // call all the handlers for the held joy stick button events
     
    432452      for (unsigned int iButton   = 0; iButton   < joyStickButtonsDown_[iJoyStick].size(); iButton++)
    433453        for (unsigned int iHandler = 0; iHandler  < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
    434           activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickButtonHeld(
    435               JoyStickState(joySticks_[iJoyStick]->getJoyStickState(), iJoyStick), joyStickButtonsDown_[iJoyStick][iButton]);
     454          activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickButtonHeld(iJoyStick, joyStickButtonsDown_[iJoyStick][iButton]);
     455
     456
     457    // call the ticks
     458    for (unsigned int iHandler = 0; iHandler < activeHandlers_.size(); iHandler++)
     459      activeHandlers_[iHandler]->tick(dt);
    436460  }
    437461
     
    508532    {
    509533      for (unsigned int i = 0; i < activeMouseHandlers_.size(); i++)
    510         activeMouseHandlers_[i]->mouseMoved(e.state);
     534        activeMouseHandlers_[i]->mouseMoved(IntVector2(e.state.X.abs, e.state.Y.abs),
     535            IntVector2(e.state.X.rel, e.state.Y.rel), IntVector2(e.state.width, e.state.height));
    511536    }
    512537
     
    515540    {
    516541      for (unsigned int i = 0; i < activeMouseHandlers_.size(); i++)
    517         activeMouseHandlers_[i]->mouseScrolled(e.state);
     542        activeMouseHandlers_[i]->mouseScrolled(e.state.Z.abs, e.state.Z.rel);
    518543    }
    519544
     
    536561
    537562    for (unsigned int i = 0; i < activeMouseHandlers_.size(); i++)
    538       activeMouseHandlers_[i]->mouseButtonPressed(e.state, (MouseButton::Enum)id);
     563      activeMouseHandlers_[i]->mouseButtonPressed((MouseButton::Enum)id);
    539564
    540565    return true;
     
    559584
    560585    for (unsigned int i = 0; i < activeMouseHandlers_.size(); i++)
    561       activeMouseHandlers_[i]->mouseButtonReleased(e.state, (MouseButton::Enum)id);
     586      activeMouseHandlers_[i]->mouseButtonReleased((MouseButton::Enum)id);
    562587
    563588    return true;
     
    584609
    585610    for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
    586       activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickButtonPressed(JoyStickState(arg.state, iJoyStick), button);
     611      activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickButtonPressed(iJoyStick, button);
    587612
    588613    return true;
     
    609634
    610635    for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
    611       activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickButtonReleased(JoyStickState(arg.state, iJoyStick), button);
     636      activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickButtonReleased(iJoyStick, button);
    612637
    613638    return true;
     
    616641  bool InputManager::axisMoved(const OIS::JoyStickEvent &arg, int axis)
    617642  {
     643    //CCOUT(3) << arg.state.mAxes[axis].abs << std::endl;
    618644    // use the device to identify which one called the method
    619645    OIS::JoyStick* joyStick = (OIS::JoyStick*)arg.device;
     
    622648      iJoyStick++;
    623649
     650    // keep in mind that the first 8 axes are reserved for the sliders
    624651    for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
    625       activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickAxisMoved(JoyStickState(arg.state, iJoyStick), axis);
     652      activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickAxisMoved(iJoyStick, axis + 8, arg.state.mAxes[axis].abs);
    626653
    627654    return true;
     
    630657  bool InputManager::sliderMoved(const OIS::JoyStickEvent &arg, int id)
    631658  {
     659    //CCOUT(3) << arg.state.mSliders[id].abX << "\t |" << arg.state.mSliders[id].abY << std::endl;
    632660    // use the device to identify which one called the method
    633661    OIS::JoyStick* joyStick = (OIS::JoyStick*)arg.device;
     
    636664      iJoyStick++;
    637665
    638     for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
    639       activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickSliderMoved(JoyStickState(arg.state, iJoyStick), id);
     666    if (sliderStates_[iJoyStick].sliderStates[id].x != arg.state.mSliders[id].abX)
     667    {
     668      // slider X axis changed
     669      sliderStates_[iJoyStick].sliderStates[id].x = arg.state.mSliders[id].abX;
     670      for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
     671        activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickAxisMoved(iJoyStick, id * 2, arg.state.mSliders[id].abX);
     672    }
     673    else if (sliderStates_[iJoyStick].sliderStates[id].y != arg.state.mSliders[id].abY)
     674    {
     675      // slider Y axis changed
     676      sliderStates_[iJoyStick].sliderStates[id].y = arg.state.mSliders[id].abY;
     677      for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
     678        activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickAxisMoved(iJoyStick, id * 2 + 1, arg.state.mSliders[id].abY);
     679    }
    640680
    641681    return true;
     
    650690      iJoyStick++;
    651691
    652     for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
    653       activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickPovMoved(JoyStickState(arg.state, iJoyStick), id);
    654 
    655     return true;
    656   }
    657 
    658   bool InputManager::vector3Moved(const OIS::JoyStickEvent &arg, int id)
     692    // translate the POV into 8 simple buttons
     693    int lastState = povStates_[iJoyStick][id];
     694    if (lastState & OIS::Pov::North)
     695      buttonReleased(arg, 32 + id * 4 + 0);
     696    if (lastState & OIS::Pov::South)
     697      buttonReleased(arg, 32 + id * 4 + 1);
     698    if (lastState & OIS::Pov::East)
     699      buttonReleased(arg, 32 + id * 4 + 2);
     700    if (lastState & OIS::Pov::West)
     701      buttonReleased(arg, 32 + id * 4 + 3);
     702   
     703    povStates_[iJoyStick].povStates[id] = arg.state.mPOV[id].direction;
     704    int currentState = povStates_[iJoyStick][id];
     705    if (currentState & OIS::Pov::North)
     706      buttonPressed(arg, 32 + id * 4 + 0);
     707    if (currentState & OIS::Pov::South)
     708      buttonPressed(arg, 32 + id * 4 + 1);
     709    if (currentState & OIS::Pov::East)
     710      buttonPressed(arg, 32 + id * 4 + 2);
     711    if (currentState & OIS::Pov::West)
     712      buttonPressed(arg, 32 + id * 4 + 3);
     713
     714    return true;
     715  }
     716
     717  /*bool InputManager::vector3Moved(const OIS::JoyStickEvent &arg, int id)
    659718  {
    660719    // use the device to identify which one called the method
     
    668727
    669728    return true;
    670   }
     729  }*/
    671730
    672731
     
    735794  }
    736795
    737   const MouseState InputManager::getMouseState()
     796  /*const MouseState InputManager::getMouseState()
    738797  {
    739798    if (_getSingleton().mouse_)
     
    741800    else
    742801      return MouseState();
    743   }
    744 
    745   const JoyStickState InputManager::getJoyStickState(unsigned int ID)
     802  }*/
     803
     804  /*const JoyStickState InputManager::getJoyStickState(unsigned int ID)
    746805  {
    747806    if (ID < _getSingleton().joySticksSize_)
     
    749808    else
    750809      return JoyStickState();
    751   }
     810  }*/
    752811
    753812
     
    882941      if ((*it) == (*mapIt).second)
    883942      {
    884         _getSingleton().stateRequest_ = IS_CUSTOM;
    885943        return true;
    886944      }
     
    888946    _getSingleton().activeKeyHandlers_.push_back((*mapIt).second);
    889947    _getSingleton().stateRequest_ = IS_CUSTOM;
     948    _getSingleton()._updateTickables();
    890949    return true;
    891950  }
     
    910969        _getSingleton().activeKeyHandlers_.erase(it);
    911970        _getSingleton().stateRequest_ = IS_CUSTOM;
     971        _getSingleton()._updateTickables();
    912972        return true;
    913973      }
    914974    }
    915     _getSingleton().stateRequest_ = IS_CUSTOM;
    916975    return true;
    917976  }
     
    10101069      if ((*it) == (*mapIt).second)
    10111070      {
    1012         _getSingleton().stateRequest_ = IS_CUSTOM;
    10131071        return true;
    10141072      }
     
    10161074    _getSingleton().activeMouseHandlers_.push_back((*mapIt).second);
    10171075    _getSingleton().stateRequest_ = IS_CUSTOM;
     1076    _getSingleton()._updateTickables();
    10181077    return true;
    10191078  }
     
    10381097        _getSingleton().activeMouseHandlers_.erase(it);
    10391098        _getSingleton().stateRequest_ = IS_CUSTOM;
     1099        _getSingleton()._updateTickables();
    10401100        return true;
    10411101      }
    10421102    }
    1043     _getSingleton().stateRequest_ = IS_CUSTOM;
    10441103    return true;
    10451104  }
     
    11471206      if ((*it) == (*handlerIt).second)
    11481207      {
    1149         _getSingleton().stateRequest_ = IS_CUSTOM;
    11501208        return true;
    11511209      }
     
    11531211    _getSingleton().activeJoyStickHandlers_[ID].push_back((*handlerIt).second);
    11541212    _getSingleton().stateRequest_ = IS_CUSTOM;
     1213    _getSingleton()._updateTickables();
    11551214    return true;
    11561215  }
     
    11801239        _getSingleton().activeJoyStickHandlers_[ID].erase(it);
    11811240        _getSingleton().stateRequest_ = IS_CUSTOM;
     1241        _getSingleton()._updateTickables();
    11821242        return true;
    11831243      }
  • code/branches/input/src/core/InputManager.h

    r1293 r1323  
    4242
    4343#include "ois/OIS.h"
     44#include "util/Math.h"
    4445#include "Tickable.h"
    4546#include "InputInterfaces.h"
     
    4748namespace orxonox
    4849{
     50  /**
     51  * Helper class to realise a vector<int[4]>
     52  */
     53  class POVStates
     54  {
     55  public:
     56    int operator[](unsigned int index) { return povStates[index]; }
     57    int povStates[4];
     58  };
     59
     60  /**
     61  * Helper class to realise a vector< {int[4], int[4]} >
     62  */
     63  class SliderStates
     64  {
     65  public:
     66    IntVector2 sliderStates[4];
     67  };
     68
    4969  /**
    5070    @brief Captures and distributes mouse and keyboard input.
     
    85105    static bool isModifierDown(KeyboardModifier::Enum modifier);
    86106    static bool isKeyDown(KeyCode::Enum key);
    87     static const MouseState getMouseState();
    88     static const JoyStickState getJoyStickState(unsigned int ID);
     107    //static const MouseState getMouseState();
     108    //static const JoyStickState getJoyStickState(unsigned int ID);
    89109
    90110    static void setWindowExtents(const int width, const int height);
     
    130150    void _destroyMouse();
    131151    void _destroyJoySticks();
     152
     153    void _updateTickables();
    132154
    133155    void tick(float dt);
     
    144166    bool sliderMoved   (const OIS::JoyStickEvent &arg, int id);
    145167    bool povMoved      (const OIS::JoyStickEvent &arg, int id);
    146     bool vector3Moved  (const OIS::JoyStickEvent &arg, int id);
     168    //bool vector3Moved  (const OIS::JoyStickEvent &arg, int id);
    147169
    148170    static InputManager& _getSingleton();
     
    160182    unsigned int keyboardModifiers_;
    161183
     184    //! Keeps track of the joy stick POV states
     185    std::vector<POVStates>                      povStates_;
     186    //! Keeps track of the possibly two slider axes
     187    std::vector<SliderStates>                   sliderStates_;
     188
    162189    std::map<std::string, KeyHandler*>          keyHandlers_;
    163190    std::map<std::string, MouseHandler*>        mouseHandlers_;
     
    167194    std::vector<MouseHandler*>                  activeMouseHandlers_;
    168195    std::vector<std::vector<JoyStickHandler*> > activeJoyStickHandlers_;
     196    std::vector<InputTickable*>                 activeHandlers_;
    169197
    170198    std::vector<Key>                            keysDown_;
  • code/branches/input/src/core/SignalHandler.cc

    r1293 r1323  
    150150  {
    151151    std::cout << "Trying to restore XAutoKeyRepeat" << std::endl;
    152         Display* display;
    153           if ((display = XOpenDisplay(0)))
    154     {
    155                         XAutoRepeatOn(display);
    156                   XCloseDisplay(display);
     152    Display* display;
     153    if ((display = XOpenDisplay(0)))
     154    {
     155      XAutoRepeatOn(display);
     156      XCloseDisplay(display);
    157157    }
    158158  }
     
    320320
    321321  std::string timeString = "\n\n\n\n"
    322                            "=======================================================\n"
    323                            "= time: " + std::string(ctime(&now)) +
    324                            "=======================================================\n";
     322                     "=======================================================\n"
     323                     "= time: " + std::string(ctime(&now)) +
     324         "=======================================================\n";
    325325  bt.insert(0, timeString);
    326326
Note: See TracChangeset for help on using the changeset viewer.