[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16333] trunk/blender/source/gameengine/ GameLogic: BGE Bugfix, SDL joysticks arrow keys didnt work when 2 joysticks were being used at the same time .

Campbell Barton ideasman42 at gmail.com
Tue Sep 2 08:12:20 CEST 2008


Revision: 16333
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16333
Author:   campbellbarton
Date:     2008-09-02 08:12:19 +0200 (Tue, 02 Sep 2008)

Log Message:
-----------
BGE Bugfix, SDL joysticks arrow keys didnt work when 2 joysticks were being used at the same time.
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

Modified Paths:
--------------
    trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp
    trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.h
    trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickDefines.h
    trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp
    trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickPrivate.h
    trunk/blender/source/gameengine/GameLogic/SCA_JoystickManager.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.cpp

Modified: trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp	2008-09-02 02:10:14 UTC (rev 16332)
+++ trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp	2008-09-02 06:12:19 UTC (rev 16333)
@@ -99,38 +99,6 @@
 	}
 }
 
-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 @@
 	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;

Modified: trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.h	2008-09-02 02:10:14 UTC (rev 16332)
+++ trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.h	2008-09-02 06:12:19 UTC (rev 16333)
@@ -29,6 +29,7 @@
 #define _SCA_JOYSTICK_H_
 
 #include "SCA_JoystickDefines.h"
+#include "SDL.h"
 
 /*
  * Basic Joystick class
@@ -104,6 +105,16 @@
 	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
 	 */
 	bool CreateJoystickDevice(void);
@@ -112,18 +123,7 @@
 	 * 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 @@
 public:
 
 	static SCA_Joystick *GetInstance( short int joyindex );
+	static void HandleEvents( void );
 	void ReleaseInstance();
 	
-	void HandleEvents();
 
 	/*
 	 */
@@ -212,18 +212,8 @@
 	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 @@
 	int Connected(void);
 };
 
+void Joystick_HandleEvents( void );
 
-
 #endif
 

Modified: trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickDefines.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickDefines.h	2008-09-02 02:10:14 UTC (rev 16332)
+++ trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickDefines.h	2008-09-02 06:12:19 UTC (rev 16333)
@@ -40,12 +40,4 @@
 
 #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

Modified: trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp	2008-09-02 02:10:14 UTC (rev 16332)
+++ trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp	2008-09-02 06:12:19 UTC (rev 16333)
@@ -30,41 +30,75 @@
 
 
 
-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;
+		}
+	}
+}

Modified: trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickPrivate.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickPrivate.h	2008-09-02 02:10:14 UTC (rev 16332)
+++ trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickPrivate.h	2008-09-02 06:12:19 UTC (rev 16333)
@@ -33,10 +33,6 @@
 {
 public:
 	/*
-	 * SDL events structure 
-	 */
-	SDL_Event		m_event;
-	/*
 	 * The Joystick
 	 */
 	SDL_Joystick*	m_joystick;

Modified: trunk/blender/source/gameengine/GameLogic/SCA_JoystickManager.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_JoystickManager.cpp	2008-09-02 02:10:14 UTC (rev 16332)
+++ trunk/blender/source/gameengine/GameLogic/SCA_JoystickManager.cpp	2008-09-02 06:12:19 UTC (rev 16333)
@@ -44,7 +44,6 @@
 	for (i=0; i<JOYINDEX_MAX; i++) {
 		m_joystick[i] = SCA_Joystick::GetInstance( i );
 	}
-	//m_joystick = NULL;
 }
 
 
@@ -59,14 +58,21 @@
 
 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);
+			}
 		}
 	}
 }

Modified: trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.cpp	2008-09-02 02:10:14 UTC (rev 16332)
+++ trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.cpp	2008-09-02 06:12:19 UTC (rev 16333)
@@ -245,10 +245,10 @@
 	}
 	
 	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)





More information about the Bf-blender-cvs mailing list