* Joystick sensor is now only triggered from events of the selected type.
authorCampbell Barton <ideasman42@gmail.com>
Wed, 8 Oct 2008 03:16:19 +0000 (03:16 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 8 Oct 2008 03:16:19 +0000 (03:16 +0000)
* Keyboard sensor - added (back?) support for qualifiers (Hold buttons in the UI)

source/blender/src/buttons_logic.c
source/gameengine/Converter/KX_ConvertSensors.cpp
source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp
source/gameengine/GameLogic/Joystick/SCA_Joystick.h
source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp
source/gameengine/GameLogic/SCA_JoystickSensor.cpp
source/gameengine/GameLogic/SCA_KeyboardSensor.cpp

index 11677ac2aa5adf0501092d30d4b10c8d1f63e762..cd917581392c79282f1cb59af7dadf2bb0e45a24 100644 (file)
@@ -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
index e538afb69a29c781bfbd69e254cde459ab3bfdb4..13b7f43195d7d15f163568392f17aaa07c77d9ca 100644 (file)
@@ -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,
index b50cfe812a93e6f1b73c641b9772c20c5b85b1b1..f271baeed164844183912459e425fe3cebf3a860 100644 (file)
@@ -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
 }
 
index 33cfbd74d05a15d706512e4f491a0fc87bbedcb4..8335d5538ad118236cb7c23cf2114ae0b8b5b03e 100644 (file)
@@ -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;
        }
 
        /*
index 7a2ec5b3deaa9ade3fb0918b42c590940b54a55a..89e2420f8228e10448dd05d03e5558dd911b891d 100644 (file)
@@ -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 */
index 2e9db5fb20a44bf49f5bb12a7fec42a40296afcf..bcd3aa842b702c9a605c3e450d8e606019249b3d 100644 (file)
@@ -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 ?*/
index d09a53949658e8d97b0e7d29803cd6f96386473e..fa39a13679f4681d3a23e120c34989814ed02d40 100644 (file)
@@ -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;