[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20397] trunk/blender/source: BGE Joystick Hat Bugfix

Campbell Barton ideasman42 at gmail.com
Mon May 25 08:24:23 CEST 2009


Revision: 20397
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20397
Author:   campbellbarton
Date:     2009-05-25 08:24:23 +0200 (Mon, 25 May 2009)

Log Message:
-----------
BGE Joystick Hat Bugfix
bug reported by blenderage on blenderartist (found other bugs too).

- "All Hat Events" didnt work.
- Multiple hats didnt work
- use a menu with direction names rather then have the user guess. disallow zero as a direction.
- Allow up to 4 hats (was 2).
- Python api was clamping the axis to 2, maximum is currently JOYAXIS_MAX - 16
- New python attributes hatValues and hatSingle, match axis functions.
- Use SDL Axis events to fill in the axis and hat array rather then filling in every axis with SDL_JoystickGetAxis for each axis event.

Modified Paths:
--------------
    trunk/blender/source/blender/src/buttons_logic.c
    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/SCA_JoystickSensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.h
    trunk/blender/source/gameengine/PyDoc/GameTypes.py

Modified: trunk/blender/source/blender/src/buttons_logic.c
===================================================================
--- trunk/blender/source/blender/src/buttons_logic.c	2009-05-25 03:28:35 UTC (rev 20396)
+++ trunk/blender/source/blender/src/buttons_logic.c	2009-05-25 06:24:23 UTC (rev 20397)
@@ -1534,13 +1534,14 @@
 			else if (joy->type == SENS_JOY_HAT)
 			{
 				uiDefButI(block, NUM, 1, "Number:", xco+10, yco-68, 0.46 * (width-20), 19,
-				&joy->hat, 1, 2.0, 100, 0,
+				&joy->hat, 1, 4.0, 100, 0,
 				"Specify which hat to use");
 				
 				if ((joy->flag & SENS_JOY_ANY_EVENT)==0) {
-					uiDefButI(block, NUM, 1, "Direction:", xco+10 + 0.6 * (width-20), yco-68, 0.4 * (width-20), 19,
-					&joy->hatf, 0, 12, 100, 0,
-					"Specify hat direction");
+					str = "Direction%t|Up%x1|Down%x4|Left%x8|Right%x2|%l|Up/Right%x3|Down/Left%x12|Up/Left%x9|Down/Right%x6"; 
+					uiDefButI(block, MENU, B_NOP, str, xco+10 + 0.6 * (width-20), yco-68, 0.4 * (width-20), 19,
+					&joy->hatf, 2.0, 31, 0, 0,
+					"The direction of the hat, use 'All Events' to recieve events on any direction");
 				}
 			}
 			else { /* (joy->type == SENS_JOY_AXIS_SINGLE)*/
@@ -2752,12 +2753,12 @@
   			uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); 
   			uiDefIDPoinBut(block, test_obpoin_but, ID_OB, 1, "OB:",		xco+40, yco-44, (width-80), 19, &(parAct->ob), "Set this object as parent"); 
 			uiBlockBeginAlign(block);
-			uiDefButBitI(block, TOGN, ACT_PARENT_COMPOUND, B_REDR,
+			uiDefButBitS(block, TOGN, ACT_PARENT_COMPOUND, B_REDR,
 				  "Compound",
 				  xco + 40, yco - 64, (width - 80)/2, 19, &parAct->flag,
 				  0.0, 0.0, 0, 0,
 				  "Add this object shape to the parent shape (only if the parent shape is already compound)");
-			uiDefButBitI(block, TOGN, ACT_PARENT_GHOST, B_REDR,
+			uiDefButBitS(block, TOGN, ACT_PARENT_GHOST, B_REDR,
 				  "Ghost",
 				  xco + 40 + ((width - 80)/2), yco - 64, (width - 80)/2, 19, &parAct->flag,
 				  0.0, 0.0, 0, 0,

Modified: trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp	2009-05-25 03:28:35 UTC (rev 20396)
+++ trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp	2009-05-25 06:24:23 UTC (rev 20397)
@@ -42,7 +42,6 @@
 	m_axismax(-1),
 	m_buttonmax(-1),
 	m_hatmax(-1),
-	m_hatdir(-2),
 	m_isinit(0),
 	m_istrig_axis(0),
 	m_istrig_button(0),
@@ -50,6 +49,10 @@
 {
 	for(int i=0; i<JOYAXIS_MAX; i++)
 		m_axis_array[i]= 0;
+	
+	for(int i=0; i<JOYHAT_MAX; i++)
+		m_hat_array[i]= 0;
+	
 #ifndef DISABLE_SDL
 	m_private = new PrivateData();
 #endif
@@ -184,22 +187,11 @@
 }
 
 
-bool SCA_Joystick::aHatIsPositive(int dir)
+bool SCA_Joystick::aHatIsPositive(int hatnum, int dir)
 {
-	bool result;
-	int res = pGetHat(dir);
-	res == dir? result = true : result = false;
-	return result;
+	return (GetHat(hatnum)==dir) ? true : false;
 }
 
-int SCA_Joystick::pGetHat(int direction)
-{
-	if(direction == m_hatdir){
-		return m_hatdir;
-	}
-	return 0;
-}
-
 int SCA_Joystick::GetNumberOfAxes()
 {
 	return m_axismax;
@@ -248,8 +240,11 @@
 		if (m_axismax > JOYAXIS_MAX) m_axismax= JOYAXIS_MAX;		/* very unlikely */
 		else if (m_axismax < 0) m_axismax = 0;
 		
+		if (m_hatmax > JOYHAT_MAX) m_hatmax= JOYHAT_MAX;			/* very unlikely */
+		else if(m_hatmax<0) m_hatmax= 0;
+		
 		if(m_buttonmax<0) m_buttonmax= 0;
-		if(m_hatmax<0) m_hatmax= 0;
+		
 	}
 	return true;
 #endif
@@ -278,15 +273,6 @@
 	return 0;
 }
 
-void SCA_Joystick::pFillAxes()
-{
-#ifndef DISABLE_SDL
-	for(int i=0; i<m_axismax; i++)
-		m_axis_array[i]= SDL_JoystickGetAxis(m_private->m_joystick, i);
-#endif
-}
-
-
 int SCA_Joystick::pGetAxis(int axisnum, int udlr)
 {
 #ifndef DISABLE_SDL

Modified: trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.h	2009-05-25 03:28:35 UTC (rev 20396)
+++ trunk/blender/source/gameengine/GameLogic/Joystick/SCA_Joystick.h	2009-05-25 06:24:23 UTC (rev 20397)
@@ -53,28 +53,20 @@
 	int				m_joyindex;
 
 	/* 
-	 *support for 2 axes 
+	 *support for JOYAXIS_MAX axes (in pairs)
 	 */
 	int m_axis_array[JOYAXIS_MAX];
+
+	/* 
+	 *support for JOYHAT_MAX hats (each is a direction)
+	 */
+	int m_hat_array[JOYHAT_MAX];	
 	
 	/*
 	 * Precision or range of the axes
 	 */
 	int 			m_prec;
 
-	/*
-	 * multiple axis values stored here
-	 */
-	int 			m_axisnum;
-	int 			m_axisvalue;
-
-	/*
-	 * max # of axes avail
-	 */
-	/*disabled
-	int 			m_axismax;
-	*/
-
 	/* 
 	 *	button values stored here 
 	 */
@@ -88,18 +80,6 @@
 	int 			m_buttonmax;
 	int 			m_hatmax;
 	
-	/*
-	 * hat values stored here 
-	 */
-	int 			m_hatnum;
-	int 			m_hatdir;
-
-	/*
-
-	 * max # of hats avail
-		disabled
-	int 			m_hatmax;
-	 */
 	/* is the joystick initialized ?*/
 	bool			m_isinit;
 
@@ -136,7 +116,6 @@
 	/*
 	 * fills the axis mnember values 
 	 */
-	void pFillAxes(void);
 	void pFillButtons(void);
 
 	/*
@@ -149,11 +128,6 @@
 	 */
 	int pGetAxis(int axisnum, int udlr);
 
-	/*
-	 * gets the current hat direction
-	 */
-	int pGetHat(int direction);
-
 	SCA_Joystick(short int index);
 
 	~SCA_Joystick();
@@ -175,7 +149,7 @@
 	bool aAnyButtonReleaseIsPositive(void);
 	bool aButtonPressIsPositive(int button);
 	bool aButtonReleaseIsPositive(int button);
-	bool aHatIsPositive(int dir);
+	bool aHatIsPositive(int hatnum, int dir);
 
 	/*
 	 * precision is default '3200' which is overridden by input
@@ -191,8 +165,8 @@
 		return m_buttonnum;
 	}
 
-	int GetHat(void){
-		return m_hatdir;
+	int GetHat(int index){
+		return m_hat_array[index];
 	}
 
 	int GetThreshold(void){

Modified: trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickDefines.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickDefines.h	2009-05-25 03:28:35 UTC (rev 20396)
+++ trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickDefines.h	2009-05-25 06:24:23 UTC (rev 20397)
@@ -40,6 +40,7 @@
 
 #define JOYINDEX_MAX			8
 #define JOYAXIS_MAX				16
+#define JOYHAT_MAX				4
 
 #define JOYAXIS_RIGHT		0
 #define JOYAXIS_UP			1

Modified: trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp	2009-05-25 03:28:35 UTC (rev 20396)
+++ trunk/blender/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp	2009-05-25 06:24:23 UTC (rev 20397)
@@ -35,17 +35,20 @@
 #ifndef DISABLE_SDL
 void SCA_Joystick::OnAxisMotion(SDL_Event* sdl_event)
 {
-	pFillAxes();
-	m_axisnum	= sdl_event->jaxis.axis;
-	m_axisvalue = sdl_event->jaxis.value;
+	if(sdl_event->jaxis.axis >= JOYAXIS_MAX)
+		return;
+	
+	m_axis_array[sdl_event->jaxis.axis]= sdl_event->jaxis.value;
 	m_istrig_axis = 1;
 }
 
 
 void SCA_Joystick::OnHatMotion(SDL_Event* sdl_event)
 {
-	m_hatdir = sdl_event->jhat.value;
-	m_hatnum = sdl_event->jhat.hat;
+	if(sdl_event->jhat.hat >= JOYAXIS_MAX)
+		return;
+
+	m_hat_array[sdl_event->jhat.hat]= sdl_event->jhat.value;
 	m_istrig_hat = 1;
 }
 

Modified: trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.cpp	2009-05-25 03:28:35 UTC (rev 20396)
+++ trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.cpp	2009-05-25 06:24:23 UTC (rev 20397)
@@ -198,35 +198,22 @@
 	case KX_JOYSENSORMODE_HAT:
 		{
 		/* what is what!
-			numberof = m_hat  -- max 2
+			numberof = m_hat  -- max 4
 			direction= m_hatf -- max 12
 			*/
 			
 			if (!js->IsTrigHat() && !reset) /* No events from SDL? - dont bother */
 				return false;
 			
-			if(m_hat == 1){
-				if(js->aHatIsPositive(m_hatf)){
-					m_istrig = 1;
+			if((m_bAllEvents && js->GetHat(m_hat-1)) || js->aHatIsPositive(m_hat-1, m_hatf)) {
+				m_istrig = 1;
+				result = true;
+			}else{
+				if(m_istrig){
+					m_istrig = 0;
 					result = true;
-				}else{
-					if(m_istrig){
-						m_istrig = 0;
-						result = true;
-					}
 				}
 			}
-			if(m_hat == 2){
-				if(js->aHatIsPositive(m_hatf)){
-					m_istrig = 1;
-					result = true;
-				}else{
-					if(m_istrig){
-						m_istrig = 0;
-						result = true;
-					}
-				}
-			}
 			break;
 		}
 		/* test for ball anyone ?*/
@@ -331,6 +318,8 @@
 	KX_PYATTRIBUTE_INT_LIST_RW_CHECK("hat",0,12,true,SCA_JoystickSensor,m_hat,2,CheckHat),
 	KX_PYATTRIBUTE_RO_FUNCTION("axisValues",	SCA_JoystickSensor, pyattr_get_axis_values),
 	KX_PYATTRIBUTE_RO_FUNCTION("axisSingle", SCA_JoystickSensor, pyattr_get_axis_single),
+	KX_PYATTRIBUTE_RO_FUNCTION("hatValues",	SCA_JoystickSensor, pyattr_get_hat_values),
+	KX_PYATTRIBUTE_RO_FUNCTION("hatSingle", SCA_JoystickSensor, pyattr_get_hat_single),
 	KX_PYATTRIBUTE_RO_FUNCTION("numAxis",		SCA_JoystickSensor, pyattr_get_num_axis),
 	KX_PYATTRIBUTE_RO_FUNCTION("numButtons",	SCA_JoystickSensor, pyattr_get_num_buttons),
 	KX_PYATTRIBUTE_RO_FUNCTION("numHats",		SCA_JoystickSensor, pyattr_get_num_hats),
@@ -617,6 +606,29 @@
 	return PyInt_FromLong(joy->GetAxisPosition(self->m_axis-1));
 }
 
+PyObject* SCA_JoystickSensor::pyattr_get_hat_values(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+	SCA_JoystickSensor* self= static_cast<SCA_JoystickSensor*>(self_v);
+	SCA_Joystick *joy = self->m_pJoystickMgr->GetJoystickDevice(self->m_joyindex);
+	
+	int hat_index= joy->GetNumberOfHats();
+	PyObject *list= PyList_New(hat_index);
+	
+	while(hat_index--) {
+		PyList_SET_ITEM(list, hat_index, PyInt_FromLong(joy->GetHat(hat_index)));
+	}
+	
+	return list;
+}
+
+PyObject* SCA_JoystickSensor::pyattr_get_hat_single(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+	SCA_JoystickSensor* self= static_cast<SCA_JoystickSensor*>(self_v);
+	SCA_Joystick *joy = self->m_pJoystickMgr->GetJoystickDevice(self->m_joyindex);
+	
+	return PyInt_FromLong(joy->GetHat(self->m_hat-1));
+}
+
 PyObject* SCA_JoystickSensor::pyattr_get_num_axis(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
 {
 	SCA_JoystickSensor* self= static_cast<SCA_JoystickSensor*>(self_v);

Modified: trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.h	2009-05-25 03:28:35 UTC (rev 20396)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list