Changeset 1323 for code/branches/input/src/core
- Timestamp:
- May 19, 2008, 10:50:09 AM (17 years ago)
- Location:
- code/branches/input/src/core
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/input/src/core/CommandExecutor.cc
r1214 r1323 31 31 #include "util/String.h" 32 32 #include "util/Convert.h" 33 #include "util/SubString.h" 33 34 #include "Identifier.h" 34 35 #include "Language.h" … … 173 174 } 174 175 175 KeybindMode CommandEvaluation::getKeybindMode()176 KeybindMode::Enum CommandEvaluation::getKeybindMode() 176 177 { 177 178 if (this->state_ == CS_Shortcut_Params || this->state_ == CS_Shortcut_Finished) … … 198 199 } 199 200 // FIXME: Had to insert a return statement 200 return (KeybindMode )0;201 return (KeybindMode::Enum)0; 201 202 } 202 203 -
code/branches/input/src/core/CommandExecutor.h
r1293 r1323 70 70 std::string read(const std::string& filename); 71 71 72 enum KeybindMode {}; // temporary73 74 72 /////////////////////// 75 73 // CommandEvaluation // … … 82 80 CommandEvaluation(); 83 81 84 KeybindMode getKeybindMode();82 KeybindMode::Enum getKeybindMode(); 85 83 bool isValid() const; 86 84 … … 89 87 inline std::string getAdditionalParameter() const 90 88 { return (this->additionalParameter_ != "") ? (" " + this->additionalParameter_) : ""; } 91 inline std::string getCommandString() const { return this->processedCommand_; }89 inline Executor* getExecutor() { return 0; } 92 90 93 91 void setEvaluatedParameter(unsigned int index, MultiTypeMath param); -
code/branches/input/src/core/CorePrereqs.h
r1293 r1323 78 78 #endif 79 79 80 namespace KeybindMode 81 { 82 enum Enum 83 { 84 None, 85 OnPress, 86 OnHold, 87 OnRelease 88 }; 89 }; 90 80 91 typedef std::string LanguageEntryLabel; 81 92 -
code/branches/input/src/core/Executor.h
r1062 r1323 233 233 MultiTypeMath defaultValue_[MAX_FUNCTOR_ARGUMENTS]; 234 234 bool bAddedDefaultValue_[MAX_FUNCTOR_ARGUMENTS]; 235 KeybindMode::Enum keybindMode_; 236 int axisParameter_; 235 237 236 238 private: -
code/branches/input/src/core/InputBuffer.cc
r1293 r1323 173 173 } 174 174 175 /** 176 * This tick() function is called by the InputManager if the InputBuffer is active. 177 * @param dt Delta time 178 */ 175 179 void InputBuffer::tick(float dt) 176 180 { -
code/branches/input/src/core/InputBuffer.h
r1293 r1323 43 43 {}; 44 44 45 class _CoreExport InputBuffer : public KeyHandler, public TickableReal45 class _CoreExport InputBuffer : public KeyHandler, public OrxonoxClass 46 46 { 47 47 struct InputBufferListenerTuple -
code/branches/input/src/core/InputHandler.cc
r1293 r1323 34 34 #include "InputHandler.h" 35 35 #include "util/Convert.h" 36 #include "util/SubString.h" 37 #include "util/String.h" 36 38 #include "Debug.h" 37 39 #include "ConfigValueIncludes.h" 38 40 #include "CoreIncludes.h" 39 41 #include "CommandExecutor.h" 42 #include "Executor.h" 40 43 41 44 namespace orxonox … … 51 54 { 52 55 RegisterObject(KeyBinder); 53 clearBindings(); 54 56 clearBindings(true); 57 58 // keys 55 59 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" 226 230 }; 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 230 235 std::string mouseButtonNames[] = { 231 236 "MouseLeft", "MouseRight", "MouseMiddle", 232 237 "MouseButton3", "MouseButton4", "MouseButton5", 233 238 "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 } 239 266 } 240 267 … … 244 271 KeyBinder::~KeyBinder() 245 272 { 273 // almost no destructors required because most of the arrays are static. 274 clearBindings(); // does some destruction work 246 275 } 247 276 … … 251 280 void KeyBinder::setConfigValues() 252 281 { 253 ConfigValueContainer* cont; 254 std::string modes[] = {"P_", "R_", "H_"}; 255 282 bool success = true; 256 283 // 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); 281 285 // 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); 306 287 // 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; 330 489 } 331 490 … … 333 492 @brief Overwrites all bindings with "" 334 493 */ 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; 355 535 } 356 536 … … 361 541 bool KeyBinder::loadBindings() 362 542 { 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 } 364 554 365 555 ConfigFileManager::getSingleton()->setFile(CFT_Keybindings, "keybindings.ini"); 556 clearBindings(); 366 557 setConfigValues(); 367 558 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 } 397 637 return true; 398 638 } … … 406 646 { 407 647 // find the appropriate key binding 408 execute SimpleBinding(bindingsKeyPress_[int(evt.key)]);648 executeBinding(bindingsKeys_[int(evt.key)].OnPress, 1.0, 1.0); 409 649 410 650 return true; … … 418 658 { 419 659 // find the appropriate key binding 420 execute SimpleBinding(bindingsKeyRelease_[int(evt.key)]);660 executeBinding(bindingsKeys_[int(evt.key)].OnRelease, 1.0, 1.0); 421 661 422 662 return true; … … 430 670 { 431 671 // find the appropriate key binding 432 execute SimpleBinding(bindingsKeyHold_[int(evt.key)]);672 executeBinding(bindingsKeys_[int(evt.key)].OnHold, 1.0, 1.0); 433 673 434 674 return true; … … 439 679 @param e Mouse state information 440 680 */ 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 } 456 791 457 792 return true; … … 462 797 @param e Mouse state information 463 798 */ 464 bool KeyBinder::mouseScrolled(const MouseState &evt) 465 { 799 bool KeyBinder::mouseScrolled(int abs, int rel) 800 { 801 // TODO: obvious... 466 802 return true; 467 803 } … … 472 808 @param id The ID of the mouse button 473 809 */ 474 bool KeyBinder::mouseButtonPressed( const MouseState& state,MouseButton::Enum id)810 bool KeyBinder::mouseButtonPressed(MouseButton::Enum id) 475 811 { 476 812 // find the appropriate key binding 477 execute SimpleBinding(bindingsMouseButtonPress_[int(id)]);813 executeBinding(bindingsMouseButtons_[int(id)].OnPress, 1.0, 1.0); 478 814 479 815 return true; … … 485 821 @param id The ID of the mouse button 486 822 */ 487 bool KeyBinder::mouseButtonReleased( const MouseState& state,MouseButton::Enum id)823 bool KeyBinder::mouseButtonReleased(MouseButton::Enum id) 488 824 { 489 825 // find the appropriate key binding 490 execute SimpleBinding(bindingsMouseButtonRelease_[int(id)]);826 executeBinding(bindingsMouseButtons_[int(id)].OnRelease, 1.0, 1.0); 491 827 492 828 return true; … … 498 834 @param id The ID of the mouse button 499 835 */ 500 bool KeyBinder::mouseButtonHeld( const MouseState& state,MouseButton::Enum id)836 bool KeyBinder::mouseButtonHeld(MouseButton::Enum id) 501 837 { 502 838 // find the appropriate key binding 503 execute SimpleBinding(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) 509 845 { 510 846 // find the appropriate key binding 511 execute SimpleBinding(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) 517 853 { 518 854 // find the appropriate key binding 519 execute SimpleBinding(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) 525 861 { 526 862 // 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 } 552 884 553 885 -
code/branches/input/src/core/InputHandler.h
r1293 r1323 40 40 41 41 #include "ois/OIS.h" 42 #include "util/Math.h" 42 43 #include "OrxonoxClass.h" 43 44 #include "CommandExecutor.h" … … 46 47 namespace orxonox 47 48 { 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 60 50 { 61 51 std::string commandStr; 62 52 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 65 92 66 93 /** … … 75 102 76 103 bool loadBindings(); 77 void clearBindings( );104 void clearBindings(bool bInit = false); 78 105 79 106 void setConfigValues(); 80 107 81 108 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); 84 114 85 115 bool keyPressed (const KeyEvent& evt); … … 87 117 bool keyHeld (const KeyEvent& evt); 88 118 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) ; 102 129 103 130 private: // variables 104 105 131 //! 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]; 113 135 //! 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]; 115 139 116 140 //! 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]; 128 144 //! 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]; 130 148 131 149 //! 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]; 139 153 //! 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_; 142 183 }; 143 184 -
code/branches/input/src/core/InputInterfaces.h
r1293 r1323 38 38 39 39 #include "ois/OIS.h" 40 #include "util/Math.h" 40 41 41 42 namespace orxonox … … 239 240 }; 240 241 241 typedef OIS::MouseState MouseState;242 243 class _CoreExport JoyStickState : OIS::JoyStickState242 //typedef OIS::MouseState MouseState; 243 244 /*class _CoreExport JoyStickState 244 245 { 245 246 public: … … 247 248 JoyStickState() { clear(); } 248 249 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; 249 262 }; 250 263 … … 252 265 @brief Interface class used for key input listeners. 253 266 */ 254 class _CoreExport KeyHandler 267 class _CoreExport KeyHandler : virtual public InputTickable 255 268 { 256 269 public: … … 264 277 @brief Interface class used for mouse input listeners. 265 278 */ 266 class _CoreExport MouseHandler 279 class _CoreExport MouseHandler : virtual public InputTickable 267 280 { 268 281 public: 269 282 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; 275 288 }; 276 289 … … 279 292 @brief Interface class used for joy stick input listeners. 280 293 */ 281 class _CoreExport JoyStickHandler 294 class _CoreExport JoyStickHandler : virtual public InputTickable 282 295 { 283 296 public: 284 297 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;} 292 303 }; 293 304 -
code/branches/input/src/core/InputManager.cc
r1293 r1323 267 267 activeJoyStickHandlers_.resize(joySticksSize_); 268 268 joyStickButtonsDown_.resize(joySticksSize_); 269 povStates_.resize(joySticksSize_); 270 sliderStates_.resize(joySticksSize_); 269 271 return success; 270 272 } … … 348 350 } 349 351 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); 350 370 } 351 371 … … 389 409 390 410 case IS_GUI: 391 // FIXME: do stuff411 // TODO: do stuff 392 412 break; 393 413 … … 426 446 for (unsigned int iButton = 0; iButton < mouseButtonsDown_.size(); iButton++) 427 447 for (unsigned int iHandler = 0; iHandler < activeMouseHandlers_.size(); iHandler++) 428 activeMouseHandlers_[iHandler]->mouseButtonHeld(mouse _->getMouseState(), mouseButtonsDown_[iButton]);448 activeMouseHandlers_[iHandler]->mouseButtonHeld(mouseButtonsDown_[iButton]); 429 449 430 450 // call all the handlers for the held joy stick button events … … 432 452 for (unsigned int iButton = 0; iButton < joyStickButtonsDown_[iJoyStick].size(); iButton++) 433 453 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); 436 460 } 437 461 … … 508 532 { 509 533 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)); 511 536 } 512 537 … … 515 540 { 516 541 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); 518 543 } 519 544 … … 536 561 537 562 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); 539 564 540 565 return true; … … 559 584 560 585 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); 562 587 563 588 return true; … … 584 609 585 610 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); 587 612 588 613 return true; … … 609 634 610 635 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); 612 637 613 638 return true; … … 616 641 bool InputManager::axisMoved(const OIS::JoyStickEvent &arg, int axis) 617 642 { 643 //CCOUT(3) << arg.state.mAxes[axis].abs << std::endl; 618 644 // use the device to identify which one called the method 619 645 OIS::JoyStick* joyStick = (OIS::JoyStick*)arg.device; … … 622 648 iJoyStick++; 623 649 650 // keep in mind that the first 8 axes are reserved for the sliders 624 651 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); 626 653 627 654 return true; … … 630 657 bool InputManager::sliderMoved(const OIS::JoyStickEvent &arg, int id) 631 658 { 659 //CCOUT(3) << arg.state.mSliders[id].abX << "\t |" << arg.state.mSliders[id].abY << std::endl; 632 660 // use the device to identify which one called the method 633 661 OIS::JoyStick* joyStick = (OIS::JoyStick*)arg.device; … … 636 664 iJoyStick++; 637 665 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 } 640 680 641 681 return true; … … 650 690 iJoyStick++; 651 691 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) 659 718 { 660 719 // use the device to identify which one called the method … … 668 727 669 728 return true; 670 } 729 }*/ 671 730 672 731 … … 735 794 } 736 795 737 const MouseState InputManager::getMouseState()796 /*const MouseState InputManager::getMouseState() 738 797 { 739 798 if (_getSingleton().mouse_) … … 741 800 else 742 801 return MouseState(); 743 } 744 745 const JoyStickState InputManager::getJoyStickState(unsigned int ID)802 }*/ 803 804 /*const JoyStickState InputManager::getJoyStickState(unsigned int ID) 746 805 { 747 806 if (ID < _getSingleton().joySticksSize_) … … 749 808 else 750 809 return JoyStickState(); 751 } 810 }*/ 752 811 753 812 … … 882 941 if ((*it) == (*mapIt).second) 883 942 { 884 _getSingleton().stateRequest_ = IS_CUSTOM;885 943 return true; 886 944 } … … 888 946 _getSingleton().activeKeyHandlers_.push_back((*mapIt).second); 889 947 _getSingleton().stateRequest_ = IS_CUSTOM; 948 _getSingleton()._updateTickables(); 890 949 return true; 891 950 } … … 910 969 _getSingleton().activeKeyHandlers_.erase(it); 911 970 _getSingleton().stateRequest_ = IS_CUSTOM; 971 _getSingleton()._updateTickables(); 912 972 return true; 913 973 } 914 974 } 915 _getSingleton().stateRequest_ = IS_CUSTOM;916 975 return true; 917 976 } … … 1010 1069 if ((*it) == (*mapIt).second) 1011 1070 { 1012 _getSingleton().stateRequest_ = IS_CUSTOM;1013 1071 return true; 1014 1072 } … … 1016 1074 _getSingleton().activeMouseHandlers_.push_back((*mapIt).second); 1017 1075 _getSingleton().stateRequest_ = IS_CUSTOM; 1076 _getSingleton()._updateTickables(); 1018 1077 return true; 1019 1078 } … … 1038 1097 _getSingleton().activeMouseHandlers_.erase(it); 1039 1098 _getSingleton().stateRequest_ = IS_CUSTOM; 1099 _getSingleton()._updateTickables(); 1040 1100 return true; 1041 1101 } 1042 1102 } 1043 _getSingleton().stateRequest_ = IS_CUSTOM;1044 1103 return true; 1045 1104 } … … 1147 1206 if ((*it) == (*handlerIt).second) 1148 1207 { 1149 _getSingleton().stateRequest_ = IS_CUSTOM;1150 1208 return true; 1151 1209 } … … 1153 1211 _getSingleton().activeJoyStickHandlers_[ID].push_back((*handlerIt).second); 1154 1212 _getSingleton().stateRequest_ = IS_CUSTOM; 1213 _getSingleton()._updateTickables(); 1155 1214 return true; 1156 1215 } … … 1180 1239 _getSingleton().activeJoyStickHandlers_[ID].erase(it); 1181 1240 _getSingleton().stateRequest_ = IS_CUSTOM; 1241 _getSingleton()._updateTickables(); 1182 1242 return true; 1183 1243 } -
code/branches/input/src/core/InputManager.h
r1293 r1323 42 42 43 43 #include "ois/OIS.h" 44 #include "util/Math.h" 44 45 #include "Tickable.h" 45 46 #include "InputInterfaces.h" … … 47 48 namespace orxonox 48 49 { 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 49 69 /** 50 70 @brief Captures and distributes mouse and keyboard input. … … 85 105 static bool isModifierDown(KeyboardModifier::Enum modifier); 86 106 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); 89 109 90 110 static void setWindowExtents(const int width, const int height); … … 130 150 void _destroyMouse(); 131 151 void _destroyJoySticks(); 152 153 void _updateTickables(); 132 154 133 155 void tick(float dt); … … 144 166 bool sliderMoved (const OIS::JoyStickEvent &arg, int id); 145 167 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); 147 169 148 170 static InputManager& _getSingleton(); … … 160 182 unsigned int keyboardModifiers_; 161 183 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 162 189 std::map<std::string, KeyHandler*> keyHandlers_; 163 190 std::map<std::string, MouseHandler*> mouseHandlers_; … … 167 194 std::vector<MouseHandler*> activeMouseHandlers_; 168 195 std::vector<std::vector<JoyStickHandler*> > activeJoyStickHandlers_; 196 std::vector<InputTickable*> activeHandlers_; 169 197 170 198 std::vector<Key> keysDown_; -
code/branches/input/src/core/SignalHandler.cc
r1293 r1323 150 150 { 151 151 std::cout << "Trying to restore XAutoKeyRepeat" << std::endl; 152 153 154 { 155 156 152 Display* display; 153 if ((display = XOpenDisplay(0))) 154 { 155 XAutoRepeatOn(display); 156 XCloseDisplay(display); 157 157 } 158 158 } … … 320 320 321 321 std::string timeString = "\n\n\n\n" 322 323 324 322 "=======================================================\n" 323 "= time: " + std::string(ctime(&now)) + 324 "=======================================================\n"; 325 325 bt.insert(0, timeString); 326 326
Note: See TracChangeset
for help on using the changeset viewer.