BGE Bugfix, SDL joysticks arrow keys didnt work when 2 joysticks were being used...
authorCampbell Barton <ideasman42@gmail.com>
Tue, 2 Sep 2008 06:12:19 +0000 (06:12 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 2 Sep 2008 06:12:19 +0000 (06:12 +0000)
The event queue was running for every joystick sensor without checking if the events were for that joystick.
seperating the event queue for each joystick is overkill so instead deal with all joysticks events in once function.

Also removed some unused functions

source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp
source/gameengine/GameLogic/Joystick/SCA_Joystick.h
source/gameengine/GameLogic/Joystick/SCA_JoystickDefines.h
source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp
source/gameengine/GameLogic/Joystick/SCA_JoystickPrivate.h
source/gameengine/GameLogic/SCA_JoystickManager.cpp
source/gameengine/GameLogic/SCA_JoystickSensor.cpp

index ec0b0303b688bce02f366c7c2403ba9be06f6567..06002060bf1b5a8ad2644a672ef79d713ccb181b 100644 (file)
@@ -99,38 +99,6 @@ void SCA_Joystick::ReleaseInstance()
        }
 }
 
-void SCA_Joystick::HandleEvents()
-{
-       if(m_isinit)
-       {
-               if(SDL_PollEvent(&m_private->m_event))
-               {
-                       switch(m_private->m_event.type)
-                       {
-                       case SDL_JOYAXISMOTION:
-                               HANDLE_AXISMOTION(OnAxisMotion);
-                               break;
-                       case SDL_JOYHATMOTION:
-                               HANDLE_HATMOTION(OnHatMotion);
-                               break;
-                       case SDL_JOYBUTTONUP:
-                               HANDLE_BUTTONUP(OnButtonUp);
-                               break;
-                       case SDL_JOYBUTTONDOWN:
-                               HANDLE_BUTTONDOWN(OnButtonDown);
-                               break;
-                       case SDL_JOYBALLMOTION: 
-                               HANDLE_BALLMOTION(OnBallMotion);
-                               break;
-                       default:
-                               HANDLE_NOEVENT(OnNothing);
-                               break;
-                       }
-               }
-       }
-}
-
-
 void SCA_Joystick::cSetPrecision(int val)
 {
        m_prec = val;
@@ -229,76 +197,6 @@ int SCA_Joystick::pGetHat(int direction)
        return 0;
 }
 
-
-bool SCA_Joystick::GetJoyAxisMotion()
-{
-       bool result = false;
-       if(m_isinit){
-               if(SDL_PollEvent(&m_private->m_event)){
-                       switch(m_private->m_event.type)
-                       {
-                       case SDL_JOYAXISMOTION:
-                               result = true;
-                               break;
-                       }
-               }
-       }
-       return result;
-}
-
-
-bool SCA_Joystick::GetJoyButtonPress()
-{
-       bool result = false;
-       if(m_isinit){
-               if(SDL_PollEvent(&m_private->m_event)){
-                       switch(m_private->m_event.type)
-                       {
-                       case SDL_JOYBUTTONDOWN:
-                               result = true;
-                               break;
-                       }
-               }
-       }
-       return result;
-}
-
-
-bool SCA_Joystick::GetJoyButtonRelease()
-{
-       bool result = false;
-       if(m_isinit)
-       {
-               if(SDL_PollEvent(&m_private->m_event)){
-                       switch(m_private->m_event.type)
-                       {
-                       case SDL_JOYBUTTONUP:
-                               result = true;
-                               break;
-                       }
-               }
-       }
-       return result;
-}
-
-
-bool SCA_Joystick::GetJoyHatMotion()
-{
-       bool result = false;
-       if(m_isinit){
-               if(SDL_PollEvent(&m_private->m_event)){
-                       switch(m_private->m_event.type)
-                       {
-                       case SDL_JOYHATMOTION:
-                               result = true;
-                               break;
-                       }
-               }
-       }
-       return 0;
-}
-
-
 int SCA_Joystick::GetNumberOfAxes()
 {
        int number;
index d318d28e0f7edb8d6d7534bcc94348f633880f06..bcbb43241c2e83c99cb07696446c9e50c6661b97 100644 (file)
@@ -29,6 +29,7 @@
 #define _SCA_JOYSTICK_H_
 
 #include "SCA_JoystickDefines.h"
+#include "SDL.h"
 
 /*
  * Basic Joystick class
@@ -103,6 +104,16 @@ class SCA_Joystick
        /* is triggered */
        bool                    m_istrig;
 
+       /*
+        * event callbacks
+        */
+       void OnAxisMotion(SDL_Event *sdl_event);
+       void OnHatMotion(SDL_Event *sdl_event);
+       void OnButtonUp(SDL_Event *sdl_event);
+       void OnButtonDown(SDL_Event *sdl_event);
+       void OnNothing(SDL_Event *sdl_event);
+       void OnBallMotion(SDL_Event *sdl_event){}
+
        /*
         * Open the joystick
         */
@@ -112,17 +123,6 @@ class SCA_Joystick
         * Close the joystick
         */
        void DestroyJoystickDevice(void);
-       
-       /*
-        * event callbacks
-        */
-
-       void OnAxisMotion(void);
-       void OnHatMotion(void);
-       void OnButtonUp(void);
-       void OnButtonDown(void);
-       void OnNothing(void);
-       void OnBallMotion(void){}
 
        /*
         * fills the axis mnember values 
@@ -158,9 +158,9 @@ class SCA_Joystick
 public:
 
        static SCA_Joystick *GetInstance( short int joyindex );
+       static void HandleEvents( void );
        void ReleaseInstance();
        
-       void HandleEvents();
 
        /*
         */
@@ -212,16 +212,6 @@ public:
        bool IsTrig(void){
                return m_istrig;
        }
-       
-
-       /*
-        * returns true if an event is being processed
-        */
-
-       bool GetJoyAxisMotion(void);
-       bool GetJoyButtonPress(void);
-       bool GetJoyButtonRelease(void);
-       bool GetJoyHatMotion(void);
 
        /*
         * returns the # of...
@@ -237,7 +227,7 @@ public:
        int Connected(void);
 };
 
-
+void Joystick_HandleEvents( void );
 
 #endif
 
index 8d8f88ecaf237455f15358c1da7f5a9390c93812..73ffe1406d91ad8057e7d8a01db57f7769c8b04c 100644 (file)
 
 #define JOYINDEX_MAX                   8
 
-/* function callbacks */
-#define HANDLE_AXISMOTION(fn)  ((fn)(), 0L)
-#define HANDLE_HATMOTION(fn)   ((fn)(), 0L)
-#define HANDLE_BUTTONUP(fn)    ((fn)(), 0L)
-#define HANDLE_BUTTONDOWN(fn)  ((fn)(), 0L)
-#define HANDLE_BALLMOTION(fn)  ((fn)(), 0L)
-#define HANDLE_NOEVENT(fn)             ((fn)(), 0L)
-
 #endif
index ab523470e217c0ed25ef3b78cfefd5e4b103411e..1e064f553970266e132dd4aa4eb4408bb1f59094 100644 (file)
 
 
 
-void SCA_Joystick::OnAxisMotion(void)
+void SCA_Joystick::OnAxisMotion(SDL_Event* sdl_event)
 {
        pFillAxes();
-       m_axisnum       = m_private->m_event.jaxis.axis;
-       m_axisvalue = m_private->m_event.jaxis.value;
+       m_axisnum       = sdl_event->jaxis.axis;
+       m_axisvalue = sdl_event->jaxis.value;
        m_istrig = 1;
 }
 
 
-void SCA_Joystick::OnHatMotion(void)
+void SCA_Joystick::OnHatMotion(SDL_Event* sdl_event)
 {
-       m_hatdir = m_private->m_event.jhat.value;
-       m_hatnum = m_private->m_event.jhat.hat;
+       m_hatdir = sdl_event->jhat.value;
+       m_hatnum = sdl_event->jhat.hat;
        m_istrig = 1;
 }
 
 
-void SCA_Joystick::OnButtonUp(void)
+void SCA_Joystick::OnButtonUp(SDL_Event* sdl_event)
 {
        m_buttonnum = -2;
 }
 
 
-void SCA_Joystick::OnButtonDown(void)
+void SCA_Joystick::OnButtonDown(SDL_Event* sdl_event)
 {
        m_buttonmax = GetNumberOfButtons();
-       if(m_private->m_event.jbutton.button >= 1 || m_private->m_event.jbutton.button <= m_buttonmax)
+       if(sdl_event->jbutton.button >= 1 || sdl_event->jbutton.button <= m_buttonmax)
        {
                m_istrig = 1;
-               m_buttonnum = m_private->m_event.jbutton.button;
+               m_buttonnum = sdl_event->jbutton.button;
        }
 }
 
 
-void SCA_Joystick::OnNothing(void)
+void SCA_Joystick::OnNothing(SDL_Event* sdl_event)
 {
        m_istrig = 0;
 }
+
+/* only handle events for 1 joystick */
+
+void SCA_Joystick::HandleEvents(void)
+{
+       SDL_Event               sdl_event;
+
+       if(SDL_PollEvent(&sdl_event))
+       {
+               /* Note! m_instance[sdl_event.jaxis.which]
+                * will segfault if over JOYINDEX_MAX, not too nice but what are the chances? */
+               switch(sdl_event.type)
+               {
+               case SDL_JOYAXISMOTION:
+                       SCA_Joystick::m_instance[sdl_event.jaxis.which]->OnAxisMotion(&sdl_event);
+                       break;
+               case SDL_JOYHATMOTION:
+                       SCA_Joystick::m_instance[sdl_event.jhat.which]->OnHatMotion(&sdl_event);
+                       break;
+               case SDL_JOYBUTTONUP:
+                       SCA_Joystick::m_instance[sdl_event.jbutton.which]->OnButtonUp(&sdl_event);
+                       break;
+               case SDL_JOYBUTTONDOWN:
+                       SCA_Joystick::m_instance[sdl_event.jbutton.which]->OnButtonDown(&sdl_event);
+                       break;
+               case SDL_JOYBALLMOTION:
+                       SCA_Joystick::m_instance[sdl_event.jball.which]->OnBallMotion(&sdl_event);
+                       break;
+               default:
+                       printf("SCA_Joystick::HandleEvents, Unknown SDL event, this should not happen\n");
+                       break;
+               }
+       }
+}
index 23fad3cd55d103984424e1f01bf46bc864d6e9ce..bb6bfe2d4cc099c3816c8673dcf67e7bca45c261 100644 (file)
 class SCA_Joystick::PrivateData
 {
 public:
-       /*
-        * SDL events structure 
-        */
-       SDL_Event               m_event;
        /*
         * The Joystick
         */
index 08c36326712a54c37415bc8209715b7875afda25..a86770a6e0a0ed4f2c2fb689bea3fa4dd7aeb0b8 100644 (file)
@@ -44,7 +44,6 @@ SCA_JoystickManager::SCA_JoystickManager(class SCA_LogicManager* logicmgr)
        for (i=0; i<JOYINDEX_MAX; i++) {
                m_joystick[i] = SCA_Joystick::GetInstance( i );
        }
-       //m_joystick = NULL;
 }
 
 
@@ -59,14 +58,21 @@ SCA_JoystickManager::~SCA_JoystickManager()
 
 void SCA_JoystickManager::NextFrame(double curtime,double deltatime)
 {
-       set<SCA_ISensor*>::iterator it;
-       for (it = m_sensors.begin(); it != m_sensors.end(); it++)
-       {
-               SCA_JoystickSensor* joysensor = (SCA_JoystickSensor*)(*it);
-               if(!joysensor->IsSuspended())
+       if (m_sensors.size()==0) {
+               return;
+       }
+       else {
+               set<SCA_ISensor*>::iterator it;
+       
+               SCA_Joystick::HandleEvents(); /* Handle all SDL Joystick events */
+       
+               for (it = m_sensors.begin(); it != m_sensors.end(); it++)
                {
-                       m_joystick[joysensor->GetJoyIndex()]->HandleEvents();
-                       joysensor->Activate(m_logicmgr, NULL);
+                       SCA_JoystickSensor* joysensor = (SCA_JoystickSensor*)(*it);
+                       if(!joysensor->IsSuspended())
+                       {
+                               joysensor->Activate(m_logicmgr, NULL);
+                       }
                }
        }
 }
index 456401d48df7a5f404948d6bf5d7808610102ed2..b32cbd83285b62ce3eef53e5d897aaa5802cd3b4 100644 (file)
@@ -245,10 +245,10 @@ bool SCA_JoystickSensor::Evaluate(CValue* event)
        }
        
        if (js->IsTrig()) {
-               /* This test detects changes with the joystick trigger state.
+               /* The if below detects changes with the joystick trigger state.
                 * js->IsTrig() will stay true as long as the key is held.
                 * even though the event from SDL will only be sent once.
-                * istrig_js && m_istrig_lastjs - when this is true it means this sensor
+                * (js->IsTrig() && m_istrig_lastjs) - when true it means this sensor
                 * had the same joystick trigger state last time,
                 * Setting the result false this time means it wont run the sensors
                 * controller every time (like a pulse sensor)