diff options
author | Campbell Barton <ideasman42@gmail.com> | 2008-10-08 07:16:19 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2008-10-08 07:16:19 +0400 |
commit | ce4162c9a13f8d147e898c625ffe1e10bca3b48d (patch) | |
tree | e178b605ed574fe8fcf24532f26ce13e24fe2144 | |
parent | b8c294d323551591a1140e3b73e03b996303eb81 (diff) |
* Joystick sensor is now only triggered from events of the selected type.
* Keyboard sensor - added (back?) support for qualifiers (Hold buttons in the UI)
-rw-r--r-- | source/blender/src/buttons_logic.c | 62 | ||||
-rw-r--r-- | source/gameengine/Converter/KX_ConvertSensors.cpp | 4 | ||||
-rw-r--r-- | source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp | 24 | ||||
-rw-r--r-- | source/gameengine/GameLogic/Joystick/SCA_Joystick.h | 20 | ||||
-rw-r--r-- | source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp | 10 | ||||
-rw-r--r-- | source/gameengine/GameLogic/SCA_JoystickSensor.cpp | 27 | ||||
-rw-r--r-- | source/gameengine/GameLogic/SCA_KeyboardSensor.cpp | 68 |
7 files changed, 158 insertions, 57 deletions
diff --git a/source/blender/src/buttons_logic.c b/source/blender/src/buttons_logic.c index 11677ac2aa5..cd917581392 100644 --- a/source/blender/src/buttons_logic.c +++ b/source/blender/src/buttons_logic.c @@ -1204,42 +1204,44 @@ static short draw_sensorbuttons(bSensor *sens, uiBlock *block, short xco, short } case SENS_KEYBOARD: { + ks= sens->data; + /* 5 lines: 120 height */ - ysize= 120; + ysize= (ks->type&1) ? 96:120; glRects(xco, yco-ysize, xco+width, yco); uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); /* header line */ draw_default_sensor_header(sens, block, xco, yco, width); - ks= sens->data; - - /* line 2: hotkey and allkeys toggle */ - uiDefKeyevtButS(block, B_DIFF, "", xco+40, yco-44, (width)/2, 19, &ks->key, "Key code"); - - /* line 3: two key modifyers (qual1, qual2) */ - uiDefKeyevtButS(block, B_DIFF, "", xco+40, yco-68, (width-50)/2, 19, &ks->qual, "Modifier key code"); - uiDefKeyevtButS(block, B_DIFF, "", xco+40+(width-50)/2, yco-68, (width-50)/2, 19, &ks->qual2, "Second Modifier key code"); - - /* labels for line 1 and 2 */ - uiDefBut(block, LABEL, 0, "Key", xco, yco-44, 40, 19, NULL, 0, 0, 0, 0, ""); - uiDefBut(block, LABEL, 0, "Hold", xco, yco-68, 40, 19, NULL, 0, 0, 0, 0, ""); /* part of line 1 */ uiBlockSetCol(block, TH_BUT_SETTING2); - uiDefButBitS(block, TOG, 1, 0, "All keys", xco+40+(width/2), yco-44, (width/2)-50, 19, + uiDefBut(block, LABEL, 0, "Key", xco, yco-44, 40, 19, NULL, 0, 0, 0, 0, ""); + uiDefButBitS(block, TOG, 1, B_REDR, "All keys", xco+40+(width/2), yco-44, (width/2)-50, 19, &ks->type, 0, 0, 0, 0, ""); + + if ((ks->type&1)==0) { /* is All Keys option off? */ + /* line 2: hotkey and allkeys toggle */ + uiDefKeyevtButS(block, B_DIFF, "", xco+40, yco-44, (width)/2, 19, &ks->key, "Key code"); + + /* line 3: two key modifyers (qual1, qual2) */ + uiDefBut(block, LABEL, 0, "Hold", xco, yco-68, 40, 19, NULL, 0, 0, 0, 0, ""); + uiDefKeyevtButS(block, B_DIFF, "", xco+40, yco-68, (width-50)/2, 19, &ks->qual, "Modifier key code"); + uiDefKeyevtButS(block, B_DIFF, "", xco+40+(width-50)/2, yco-68, (width-50)/2, 19, &ks->qual2, "Second Modifier key code"); + } + /* line 4: toggle property for string logging mode */ uiDefBut(block, TEX, 1, "LogToggle: ", - xco+10, yco-92, (width-20), 19, + xco+10, yco-((ks->type&1) ? 68:92), (width-20), 19, ks->toggleName, 0, 31, 0, 0, "Property that indicates whether to log " "keystrokes as a string."); /* line 5: target property for string logging mode */ uiDefBut(block, TEX, 1, "Target: ", - xco+10, yco-116, (width-20), 19, + xco+10, yco-((ks->type&1) ? 92:116), (width-20), 19, ks->targetName, 0, 31, 0, 0, "Property that receives the keystrokes in case " "a string is logged."); @@ -1456,12 +1458,26 @@ static short draw_sensorbuttons(bSensor *sens, uiBlock *block, short xco, short &joy->type, 0, 31, 0, 0, "The type of event this joystick sensor is triggered on."); - uiDefButBitS(block, TOG, SENS_JOY_ANY_EVENT, B_REDR, - (joy->flag & SENS_JOY_ANY_EVENT) ? "All Events" : "All", - xco+10 + 0.5 * (width-20), yco-68, ((joy->flag & SENS_JOY_ANY_EVENT) ? 0.5 : 0.098) * (width-20), 19, - &joy->flag, 0, 0, 0, 0, - "Trigger from all events of the current (axis/button/hat)"); + if (joy->flag & SENS_JOY_ANY_EVENT) { + switch (joy->type) { + case SENS_JOY_AXIS: + str = "All Axis Events"; + break; + case SENS_JOY_BUTTON: + str = "All Button Events"; + break; + default: + str = "All Hat Events"; + break; + } + } else { + str = "All"; + } + uiDefButBitS(block, TOG, SENS_JOY_ANY_EVENT, B_REDR, str, + xco+10 + 0.475 * (width-20), yco-68, ((joy->flag & SENS_JOY_ANY_EVENT) ? 0.525 : 0.12) * (width-20), 19, + &joy->flag, 0, 0, 0, 0, + "Triggered by all events on this joysticks current type (axis/button/hat)"); if(joy->type == SENS_JOY_BUTTON) { @@ -1475,7 +1491,7 @@ static short draw_sensorbuttons(bSensor *sens, uiBlock *block, short xco, short { uiDefButI(block, NUM, 1, "Number:", xco+10, yco-68, 0.46 * (width-20), 19, &joy->axis, 1, 2.0, 100, 0, - "Specify which axis to use"); + "Specify which axis pair to use, 1 is useually the main direction input."); uiDefButI(block, NUM, 1, "Threshold:", xco+10 + 0.6 * (width-20),yco-44, 0.4 * (width-20), 19, &joy->precision, 0, 32768.0, 100, 0, @@ -1485,7 +1501,7 @@ static short draw_sensorbuttons(bSensor *sens, uiBlock *block, short xco, short str = "Type %t|Up Axis %x1 |Down Axis %x3|Left Axis %x2|Right Axis %x0"; uiDefButI(block, MENU, B_REDR, str, xco+10 + 0.6 * (width-20), yco-68, 0.4 * (width-20), 19, &joy->axisf, 2.0, 31, 0, 0, - "The direction of the axis"); + "The direction of the axis, use 'All Events' to recieve events on any direction"); } } else diff --git a/source/gameengine/Converter/KX_ConvertSensors.cpp b/source/gameengine/Converter/KX_ConvertSensors.cpp index e538afb69a2..13b7f43195d 100644 --- a/source/gameengine/Converter/KX_ConvertSensors.cpp +++ b/source/gameengine/Converter/KX_ConvertSensors.cpp @@ -433,8 +433,8 @@ void BL_ConvertSensors(struct Object* blenderobject, { gamesensor = new SCA_KeyboardSensor(eventmgr, gReverseKeyTranslateTable[blenderkeybdsensor->key], - blenderkeybdsensor->qual, - blenderkeybdsensor->qual2, + gReverseKeyTranslateTable[blenderkeybdsensor->qual], + gReverseKeyTranslateTable[blenderkeybdsensor->qual2], (blenderkeybdsensor->type == SENS_ALL_KEYS), blenderkeybdsensor->targetName, blenderkeybdsensor->toggleName, diff --git a/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp b/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp index b50cfe812a9..f271baeed16 100644 --- a/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp +++ b/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp @@ -42,7 +42,9 @@ SCA_Joystick::SCA_Joystick(short int index) m_buttonnum(-2), m_hatdir(-2), m_isinit(0), - m_istrig(0), + m_istrig_axis(0), + m_istrig_button(0), + m_istrig_hat(0), m_axismax(-1), m_buttonmax(-1), m_hatmax(-1) @@ -310,13 +312,25 @@ int SCA_Joystick::pGetAxis(int axisnum, int udlr) return 0; } -#define MAX2(x,y) ( (x)>(y) ? (x) : (y) ) int SCA_Joystick::pAxisTest(int axisnum) { #ifndef DISABLE_SDL - if(axisnum == 1)return MAX2(abs(m_axis10), abs(m_axis11)); - if(axisnum == 2)return MAX2(abs(m_axis20), abs(m_axis21)); -#endif + short i1,i2; + if(axisnum == 1) { + i1 = m_axis10; i2 = m_axis11; + } + else if(axisnum == 2) { + i1 = m_axis20; i2 = m_axis21; + } + /* long winded way to do + * return MAX2(abs(i1), abs(i2)) + * avoid abs from math.h */ + if (i1 < 0) i1 = -i1; + if (i2 < 0) i2 = -i2; + if (i1 <i2) return i2; + else return i1; +#else return 0; +#endif } diff --git a/source/gameengine/GameLogic/Joystick/SCA_Joystick.h b/source/gameengine/GameLogic/Joystick/SCA_Joystick.h index 33cfbd74d05..8335d5538ad 100644 --- a/source/gameengine/GameLogic/Joystick/SCA_Joystick.h +++ b/source/gameengine/GameLogic/Joystick/SCA_Joystick.h @@ -90,7 +90,7 @@ class SCA_Joystick int m_buttonmax; int m_hatmax; - /* + /* * hat values stored here */ int m_hatnum; @@ -106,8 +106,10 @@ class SCA_Joystick bool m_isinit; - /* is triggered */ - bool m_istrig; + /* is triggered for each event type */ + bool m_istrig_axis; + bool m_istrig_button; + bool m_istrig_hat; #ifndef DISABLE_SDL /* @@ -212,8 +214,16 @@ public: return m_prec; } - bool IsTrig(void){ - return m_istrig; + bool IsTrigAxis(void){ + return m_istrig_axis; + } + + bool IsTrigButton(void){ + return m_istrig_button; + } + + bool IsTrigHat(void){ + return m_istrig_hat; } /* diff --git a/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp b/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp index 7a2ec5b3dea..89e2420f822 100644 --- a/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp +++ b/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp @@ -38,7 +38,7 @@ void SCA_Joystick::OnAxisMotion(SDL_Event* sdl_event) pFillAxes(); m_axisnum = sdl_event->jaxis.axis; m_axisvalue = sdl_event->jaxis.value; - m_istrig = 1; + m_istrig_axis = 1; } @@ -46,12 +46,12 @@ void SCA_Joystick::OnHatMotion(SDL_Event* sdl_event) { m_hatdir = sdl_event->jhat.value; m_hatnum = sdl_event->jhat.hat; - m_istrig = 1; + m_istrig_hat = 1; } void SCA_Joystick::OnButtonUp(SDL_Event* sdl_event) { - m_istrig = 1; + m_istrig_button = 1; /* this is needed for the "all events" option * so we know if there are no buttons pressed */ @@ -70,7 +70,7 @@ void SCA_Joystick::OnButtonDown(SDL_Event* sdl_event) { if(sdl_event->jbutton.button >= 0 || sdl_event->jbutton.button <= m_buttonmax) { - m_istrig = 1; + m_istrig_button = 1; m_buttonnum = sdl_event->jbutton.button; } } @@ -78,7 +78,7 @@ void SCA_Joystick::OnButtonDown(SDL_Event* sdl_event) void SCA_Joystick::OnNothing(SDL_Event* sdl_event) { - m_istrig = 0; + m_istrig_axis = m_istrig_button = m_istrig_hat = 0; } /* only handle events for 1 joystick */ diff --git a/source/gameengine/GameLogic/SCA_JoystickSensor.cpp b/source/gameengine/GameLogic/SCA_JoystickSensor.cpp index 2e9db5fb20a..bcd3aa842b7 100644 --- a/source/gameengine/GameLogic/SCA_JoystickSensor.cpp +++ b/source/gameengine/GameLogic/SCA_JoystickSensor.cpp @@ -110,9 +110,6 @@ bool SCA_JoystickSensor::Evaluate(CValue* event) if(js==NULL) /* no joystick - dont do anything */ return false; - if (!js->IsTrig()) /* No events from SDL? - dont bother */ - return reset ? true : false; - m_reset = false; switch(m_joymode) { @@ -125,6 +122,10 @@ bool SCA_JoystickSensor::Evaluate(CValue* event) m_axisf == 3 == down numberof== m_axis -- max 2 */ + + if (!js->IsTrigAxis()) /* No events from SDL? - dont bother */ + return reset ? true : false; + js->cSetPrecision(m_precision); if (m_bAllEvents) { if(js->aAnyAxisIsPositive(m_axis)){ @@ -188,6 +189,9 @@ bool SCA_JoystickSensor::Evaluate(CValue* event) /* what is what! m_button = the actual button in question */ + if (!js->IsTrigButton()) /* No events from SDL? - dont bother */ + return reset ? true : false; + if(( m_bAllEvents && js->aAnyButtonPressIsPositive()) || (!m_bAllEvents && js->aButtonPressIsPositive(m_button))) { m_istrig = 1; result = true; @@ -205,6 +209,10 @@ bool SCA_JoystickSensor::Evaluate(CValue* event) numberof = m_hat -- max 2 direction= m_hatf -- max 12 */ + + if (!js->IsTrigHat()) /* No events from SDL? - dont bother */ + return reset ? true : false; + if(m_hat == 1){ if(js->aHatIsPositive(m_hatf)){ m_istrig = 1; @@ -227,19 +235,6 @@ bool SCA_JoystickSensor::Evaluate(CValue* event) } } } - /* - if(m_hat == 3){ - if(js->aHatIsPositive(m_hatf)){ - m_istrig = 1; - result = true; - }else{ - if(m_istrig){ - m_istrig = 0; - result = true; - } - } - } - */ break; } /* test for ball anyone ?*/ diff --git a/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp b/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp index d09a5394965..fa39a13679f 100644 --- a/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp +++ b/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp @@ -122,6 +122,10 @@ bool SCA_KeyboardSensor::Evaluate(CValue* eventval) { bool result = false; bool reset = m_reset && m_level; + bool qual = true; + bool qual_change = false; + short int m_val_orig = m_val; + SCA_IInputDevice* inputdev = m_pKeyboardMgr->GetInputDevice(); // cerr << "SCA_KeyboardSensor::Eval event, sensing for "<< m_hotkey << " at device " << inputdev << "\n"; @@ -202,7 +206,43 @@ bool SCA_KeyboardSensor::Evaluate(CValue* eventval) (SCA_IInputDevice::KX_EnumInputs) m_hotkey); // cerr << "======= SCA_KeyboardSensor::Evaluate:: status: " << inevent.m_status << endl; - + + + /* Check qualifier keys + * - see if the qualifiers we request are pressed - 'qual' true/false + * - see if the qualifiers we request changed their state - 'qual_change' true/false + */ + if (m_qual > 0) { + const SCA_InputEvent & qualevent = inputdev->GetEventValue((SCA_IInputDevice::KX_EnumInputs) m_qual); + switch(qualevent.m_status) { + case SCA_InputEvent::KX_NO_INPUTSTATUS: + qual = false; + break; + case SCA_InputEvent::KX_JUSTRELEASED: + qual_change = true; + qual = false; + break; + case SCA_InputEvent::KX_JUSTACTIVATED: + qual_change = true; + } + } + if (m_qual2 > 0 && qual==true) { + const SCA_InputEvent & qualevent = inputdev->GetEventValue((SCA_IInputDevice::KX_EnumInputs) m_qual2); + /* copy of above */ + switch(qualevent.m_status) { + case SCA_InputEvent::KX_NO_INPUTSTATUS: + qual = false; + break; + case SCA_InputEvent::KX_JUSTRELEASED: + qual_change = true; + qual = false; + break; + case SCA_InputEvent::KX_JUSTACTIVATED: + qual_change = true; + } + } + /* done reading qualifiers */ + if (inevent.m_status == SCA_InputEvent::KX_NO_INPUTSTATUS) { if (m_val == 1) @@ -240,7 +280,33 @@ bool SCA_KeyboardSensor::Evaluate(CValue* eventval) } } } + + /* Modify the key state based on qual(s) + * Tested carefuly. dont touch unless your really sure. + * note, this will only change the results if key modifiers are set. + * + * When all modifiers and keys are positive + * - pulse true + * + * When ANY of the modifiers or main key become inactive, + * - pulse false + */ + if (qual==false) { /* one of the qualifiers are not pressed */ + if (m_val_orig && qual_change) { /* we were originally enabled, but a qualifier changed */ + result = true; + } else { + result = false; + } + m_val = 0; /* since one of the qualifiers is not on, set the state to false */ + } else { /* we done have any qualifiers or they are all pressed */ + if (m_val && qual_change) { /* the main key state is true and our qualifier just changed */ + result = true; + } + } + /* done with key quals */ + } + if (reset) // force an event result = true; |