[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16319] trunk/blender/source: BGE patch approved: BGE Multiple Joysticks

Benoit Bolsee benoit.bolsee at online.be
Sun Aug 31 20:42:58 CEST 2008


Revision: 16319
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16319
Author:   ben2610
Date:     2008-08-31 20:42:58 +0200 (Sun, 31 Aug 2008)

Log Message:
-----------
BGE patch approved: BGE Multiple Joysticks

Modified Paths:
--------------
    trunk/blender/source/blender/makesdna/DNA_sensor_types.h
    trunk/blender/source/blender/src/buttons_logic.c
    trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp
    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/SCA_JoystickManager.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_JoystickManager.h
    trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.h

Modified: trunk/blender/source/blender/makesdna/DNA_sensor_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_sensor_types.h	2008-08-31 16:23:31 UTC (rev 16318)
+++ trunk/blender/source/blender/makesdna/DNA_sensor_types.h	2008-08-31 18:42:58 UTC (rev 16319)
@@ -164,7 +164,7 @@
 typedef struct bJoystickSensor {
 	char name[32];
 	short type;
-	short pad;
+	short joyindex;
 	int axis;
 	int axisf;
 	int button;
@@ -266,6 +266,7 @@
 #define SENS_JOY_HAT_DIR		0
 
 #define SENS_DELAY_REPEAT		1
-
+// should match JOYINDEX_MAX in SCA_JoystickDefines.h */
+#define SENS_JOY_MAXINDEX		8
 #endif
 

Modified: trunk/blender/source/blender/src/buttons_logic.c
===================================================================
--- trunk/blender/source/blender/src/buttons_logic.c	2008-08-31 16:23:31 UTC (rev 16318)
+++ trunk/blender/source/blender/src/buttons_logic.c	2008-08-31 18:42:58 UTC (rev 16319)
@@ -1444,10 +1444,13 @@
 			draw_default_sensor_header(sens, block, xco, yco, width);
 
 			joy= sens->data;
-			
 
+			uiDefButS(block, NUM, 1, "Index:", xco+10, yco-44, 0.6 * (width-120), 19,
+			&joy->joyindex, 0, SENS_JOY_MAXINDEX-1, 100, 0,
+			"Spesify which joystick to use");			
+
 			str= "Type %t|Button %x0|Axis %x1|Hat%x2"; 
-			uiDefButS(block, MENU, B_REDR, str, xco+10, yco-44, 0.6 * (width-20), 19,
+			uiDefButS(block, MENU, B_REDR, str, xco+87, yco-44, 0.6 * (width-150), 19,
 				&joy->type, 0, 31, 0, 0,
 				"The type of event this joystick sensor is triggered on.");
 			

Modified: trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp	2008-08-31 16:23:31 UTC (rev 16318)
+++ trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp	2008-08-31 18:42:58 UTC (rev 16319)
@@ -713,6 +713,7 @@
 					gamesensor = new SCA_JoystickSensor(
 						eventmgr,
 						gameobj,
+						bjoy->joyindex,
 						joysticktype,
 						axis,axisf,
 						prec,

Modified: trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp	2008-08-31 16:23:31 UTC (rev 16318)
+++ trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp	2008-08-31 18:42:58 UTC (rev 16319)
@@ -29,9 +29,9 @@
 #include "SCA_Joystick.h"
 #include "SCA_JoystickPrivate.h"
 
-
-SCA_Joystick::SCA_Joystick()
+SCA_Joystick::SCA_Joystick(short int index)
 	:
+	m_joyindex(index),
 	m_axis10(0),
 	m_axis11(0),
 	m_axis20(0),
@@ -52,50 +52,53 @@
 	delete m_private;
 }
 
-SCA_Joystick *SCA_Joystick::m_instance = NULL;
+SCA_Joystick *SCA_Joystick::m_instance[JOYINDEX_MAX];
 int SCA_Joystick::m_refCount = 0;
 
-SCA_Joystick *SCA_Joystick::GetInstance()
+SCA_Joystick *SCA_Joystick::GetInstance( short int joyindex )
 {
-	if (m_instance == 0) 
+	if (joyindex < 0 || joyindex >= JOYINDEX_MAX) {
+		echo("Error-invalid joystick index: " << joyindex);
+		return NULL;
+	}
+
+	if (m_refCount == 0) 
 	{
-		m_instance = new SCA_Joystick();
-		m_instance->CreateJoystickDevice();
+		int i;
+		// do this once only
+		if(SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO ) == -1 ){
+			echo("Error-Initializing-SDL: " << SDL_GetError());
+			return NULL;
+		}
+		for (i=0; i<JOYINDEX_MAX; i++) {
+			m_instance[i] = new SCA_Joystick(i);
+			m_instance[i]->CreateJoystickDevice();
+		}
 		m_refCount = 1;
 	}
 	else
 	{
 		m_refCount++;
 	}
-	return m_instance;
+	return m_instance[joyindex];
 }
 
 void SCA_Joystick::ReleaseInstance()
 {
 	if (--m_refCount == 0)
 	{
-		DestroyJoystickDevice();
-		delete m_instance;
-		m_instance = NULL;
+		int i;
+		for (i=0; i<JOYINDEX_MAX; i++) {
+			if (m_instance[i]) {
+				m_instance[i]->DestroyJoystickDevice();
+				delete m_instance[i];
+			}
+			m_instance[i]= NULL;
+		}
+		SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO );
 	}
 }
 
-
-bool SCA_Joystick::CreateJoystickDevice()
-{
-	bool init = false;
-	init = pCreateJoystickDevice();
-	return init;
-}
-
-
-void SCA_Joystick::DestroyJoystickDevice()
-{
-	if(m_isinit)
-		pDestroyJoystickDevice();
-}
-
-
 void SCA_Joystick::HandleEvents()
 {
 	if(m_isinit)
@@ -334,40 +337,34 @@
 	return -1;
 }
 
-bool SCA_Joystick::pCreateJoystickDevice()
+bool SCA_Joystick::CreateJoystickDevice(void)
 {
 	if(m_isinit == false){
-		if(SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO ) == -1 ){
-			echo("Error-Initializing-SDL: " << SDL_GetError());
+		if (m_joyindex>=SDL_NumJoysticks()) {
+			// don't print a message, because this is done anyway
+			//echo("Joystick-Error: " << SDL_NumJoysticks() << " avaiable joystick(s)");
 			return false;
 		}
-		if(SDL_NumJoysticks() > 0){
-			for(int i=0; i<SDL_NumJoysticks();i++){
-				m_private->m_joystick = SDL_JoystickOpen(i);
-				SDL_JoystickEventState(SDL_ENABLE);
-				m_numjoys = i;
-			}
-			echo("Joystick-initialized");
-			m_isinit = true;
-			return true;
-		}else{
-			echo("Joystick-Error: " << SDL_NumJoysticks() << " avaiable joystick(s)");
-			return false;
-		}
+
+		m_private->m_joystick = SDL_JoystickOpen(m_joyindex);
+		SDL_JoystickEventState(SDL_ENABLE);
+	
+		echo("Joystick " << m_joyindex << " initialized");
+		m_isinit = true;
 	}
-	return false;
+	return true;
 }
 
 
-void SCA_Joystick::pDestroyJoystickDevice()
+void SCA_Joystick::DestroyJoystickDevice(void)
 {
-	echo("Closing-");
-	for(int i=0; i<SDL_NumJoysticks(); i++){
-		if(SDL_JoystickOpened(i)){
+	if (m_isinit){
+		if(SDL_JoystickOpened(m_joyindex)){
+			echo("Closing-joystick " << m_joyindex);
 			SDL_JoystickClose(m_private->m_joystick);
 		}
+		m_isinit = false;
 	}
-	SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO );
 }
 
 

Modified: trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.h	2008-08-31 16:23:31 UTC (rev 16318)
+++ trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.h	2008-08-31 18:42:58 UTC (rev 16319)
@@ -76,7 +76,7 @@
 class SCA_Joystick
 
 {
-	static SCA_Joystick *m_instance;
+	static SCA_Joystick *m_instance[JOYINDEX_MAX];
 	static int m_refCount;
 
 	class PrivateData;
@@ -85,14 +85,6 @@
 
 	int				m_joyindex;
 
-	/*!
-
-	 * the number of avail joysticks 
-
-	 */
-
-	int 			m_numjoys;
-
 	/* 
 
 	 *support for 2 axes 
@@ -185,7 +177,7 @@
 
 	 */
 
-	bool pCreateJoystickDevice(void);
+	bool CreateJoystickDevice(void);
 
 	/*
 
@@ -193,7 +185,7 @@
 
 	 */
 
-	void pDestroyJoystickDevice(void);
+	void DestroyJoystickDevice(void);
 
 	
 
@@ -259,18 +251,13 @@
 
 	int pGetHat(int direction);
 
-	SCA_Joystick();
+	SCA_Joystick(short int index);
 
 	~SCA_Joystick();
 	
-	bool CreateJoystickDevice(void);
-
-	void DestroyJoystickDevice(void);
-
-
 public:
 
-	static SCA_Joystick *GetInstance();
+	static SCA_Joystick *GetInstance( short int joyindex );
 
 	void ReleaseInstance();
 	

Modified: trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickDefines.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickDefines.h	2008-08-31 16:23:31 UTC (rev 16318)
+++ trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickDefines.h	2008-08-31 18:42:58 UTC (rev 16319)
@@ -38,6 +38,8 @@
 #define echo(x) std::cout << x << std::endl;
 #endif
 
+#define JOYINDEX_MAX			8
+
 /* function callbacks */
 #define HANDLE_AXISMOTION(fn)	((fn)(), 0L)
 #define HANDLE_HATMOTION(fn)	((fn)(), 0L)

Modified: trunk/blender/source/gameengine/GameLogic/SCA_JoystickManager.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_JoystickManager.cpp	2008-08-31 16:23:31 UTC (rev 16318)
+++ trunk/blender/source/gameengine/GameLogic/SCA_JoystickManager.cpp	2008-08-31 18:42:58 UTC (rev 16319)
@@ -40,13 +40,20 @@
 	: SCA_EventManager(JOY_EVENTMGR),
 	m_logicmgr(logicmgr)
 {
-	m_joystick = SCA_Joystick::GetInstance();
+	int i;
+	for (i=0; i<JOYINDEX_MAX; i++) {
+		m_joystick[i] = SCA_Joystick::GetInstance( i );
+	}
+	//m_joystick = NULL;
 }
 
 
 SCA_JoystickManager::~SCA_JoystickManager()
 {
-	m_joystick->ReleaseInstance();
+	int i;
+	for (i=0; i<JOYINDEX_MAX; i++) {
+		m_joystick[i]->ReleaseInstance();
+	}
 }
 
 
@@ -58,17 +65,17 @@
 		SCA_JoystickSensor* joysensor = (SCA_JoystickSensor*)(*it);
 		if(!joysensor->IsSuspended())
 		{
-			m_joystick->HandleEvents();
+			m_joystick[joysensor->GetJoyIndex()]->HandleEvents();
 			joysensor->Activate(m_logicmgr, NULL);
 		}
 	}
 }
 
 
-SCA_Joystick *SCA_JoystickManager::GetJoystickDevice()
+SCA_Joystick *SCA_JoystickManager::GetJoystickDevice( short int joyindex)
 {
 	/* 
 	 *Return the instance of SCA_Joystick for use 
  	 */
-	return m_joystick;
+	return m_joystick[joyindex];
 }

Modified: trunk/blender/source/gameengine/GameLogic/SCA_JoystickManager.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_JoystickManager.h	2008-08-31 16:23:31 UTC (rev 16318)
+++ trunk/blender/source/gameengine/GameLogic/SCA_JoystickManager.h	2008-08-31 18:42:58 UTC (rev 16319)
@@ -40,12 +40,12 @@
 	/**
 	 * SDL Joystick Class Instance
 	 */
-	SCA_Joystick *m_joystick;
+	SCA_Joystick *m_joystick[JOYINDEX_MAX];
 public:
 	SCA_JoystickManager(class SCA_LogicManager* logicmgr);
 	virtual ~SCA_JoystickManager();
 	virtual void NextFrame(double curtime,double deltatime);
-	SCA_Joystick* GetJoystickDevice(void);
+	SCA_Joystick* GetJoystickDevice(short int joyindex);
 
 };
 

Modified: trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.cpp	2008-08-31 16:23:31 UTC (rev 16318)
+++ trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.cpp	2008-08-31 18:42:58 UTC (rev 16319)
@@ -39,6 +39,7 @@
 
 SCA_JoystickSensor::SCA_JoystickSensor(class SCA_JoystickManager* eventmgr,
 									   SCA_IObject* gameobj,
+									   short int joyindex,
 									   short int joymode,
 									   int axis, int axisf,int prec,
 									   int button, int buttonf,
@@ -53,7 +54,8 @@
 									   m_hat(hat),
 									   m_hatf(hatf),
 									   m_precision(prec),
-									   m_joymode(joymode)
+									   m_joymode(joymode),
+									   m_joyindex(joyindex)
 {	
 /*
 std::cout << " axis "		<< m_axis		<< std::endl;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list