Преглед изворни кода

Merge branch 'master' of github.com:bkaradzic/bgfx

Branimir Karadžić пре 10 година
родитељ
комит
2063dac676
1 измењених фајлова са 121 додато и 11 уклоњено
  1. 121 11
      examples/common/entry/entry_sdl.cpp

+ 121 - 11
examples/common/entry/entry_sdl.cpp

@@ -21,6 +21,9 @@ BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wextern-c-compat")
 BX_PRAGMA_DIAGNOSTIC_POP_CLANG()
 BX_PRAGMA_DIAGNOSTIC_POP_CLANG()
 
 
 #include <bgfx/bgfxplatform.h>
 #include <bgfx/bgfxplatform.h>
+#if defined(None) // X11 defines this...
+#	undef None
+#endif // defined(None)
 
 
 #include <stdio.h>
 #include <stdio.h>
 #include <bx/thread.h>
 #include <bx/thread.h>
@@ -82,6 +85,22 @@ namespace entry
 		return GamepadAxis::Enum(s_translateGamepadAxis[_sdl]);
 		return GamepadAxis::Enum(s_translateGamepadAxis[_sdl]);
 	}
 	}
 
 
+	struct AxisDpadRemap
+	{
+		Key::Enum first;
+		Key::Enum second;
+	};
+
+	static AxisDpadRemap s_axisDpad[] =
+	{
+		{ Key::GamepadLeft, Key::GamepadRight },
+		{ Key::GamepadUp,   Key::GamepadDown  },
+		{ Key::None,        Key::None         },
+		{ Key::GamepadLeft, Key::GamepadRight },
+		{ Key::GamepadUp,   Key::GamepadDown  },
+		{ Key::None,        Key::None         },
+	};
+
 	struct GamepadSDL
 	struct GamepadSDL
 	{
 	{
 		GamepadSDL()
 		GamepadSDL()
@@ -99,17 +118,59 @@ namespace entry
 			m_deadzone[GamepadAxis::RightZ] = 30;
 			m_deadzone[GamepadAxis::RightZ] = 30;
 		}
 		}
 
 
-		void create(int32_t _jid)
+		void create(const SDL_JoyDeviceEvent& _jev)
 		{
 		{
-			m_controller = SDL_GameControllerOpen(_jid);
+			m_joystick = SDL_JoystickOpen(_jev.which);
+			SDL_Joystick* joystick = m_joystick;
+			m_jid = SDL_JoystickInstanceID(joystick);
+		}
+
+		void create(const SDL_ControllerDeviceEvent& _cev)
+		{
+			m_controller = SDL_GameControllerOpen(_cev.which);
 			SDL_Joystick* joystick = SDL_GameControllerGetJoystick(m_controller);
 			SDL_Joystick* joystick = SDL_GameControllerGetJoystick(m_controller);
 			m_jid = SDL_JoystickInstanceID(joystick);
 			m_jid = SDL_JoystickInstanceID(joystick);
 		}
 		}
 
 
+		void update(EventQueue& _eventQueue, WindowHandle _handle, GamepadHandle _gamepad, GamepadAxis::Enum _axis, int32_t _value)
+		{
+			if (filter(_axis, &_value) )
+			{
+				_eventQueue.postAxisEvent(_handle, _gamepad, _axis, _value);
+
+				if (Key::None != s_axisDpad[_axis].first)
+				{
+					if (_value == 0)
+					{
+						_eventQueue.postKeyEvent(_handle, s_axisDpad[_axis].first,  0, false);
+						_eventQueue.postKeyEvent(_handle, s_axisDpad[_axis].second, 0, false);
+					}
+					else
+					{
+						_eventQueue.postKeyEvent(_handle
+								, 0 > _value ? s_axisDpad[_axis].first : s_axisDpad[_axis].second
+								, 0
+								, true
+								);
+					}
+				}
+			}
+		}
+
 		void destroy()
 		void destroy()
 		{
 		{
-			SDL_GameControllerClose(m_controller);
-			m_controller = NULL;
+			if (NULL != m_controller)
+			{
+				SDL_GameControllerClose(m_controller);
+				m_controller = NULL;
+			}
+
+			if (NULL != m_joystick)
+			{
+				SDL_JoystickClose(m_joystick);
+				m_joystick = NULL;
+			}
+
 			m_jid = INT32_MAX;
 			m_jid = INT32_MAX;
 		}
 		}
 
 
@@ -127,6 +188,7 @@ namespace entry
 		int32_t m_value[GamepadAxis::Count];
 		int32_t m_value[GamepadAxis::Count];
 		int32_t m_deadzone[GamepadAxis::Count];
 		int32_t m_deadzone[GamepadAxis::Count];
 
 
+		SDL_Joystick*       m_joystick;
 		SDL_GameController* m_controller;
 		SDL_GameController* m_controller;
 //		SDL_Haptic*         m_haptic;
 //		SDL_Haptic*         m_haptic;
 		SDL_JoystickID      m_jid;
 		SDL_JoystickID      m_jid;
@@ -334,7 +396,6 @@ namespace entry
 			m_mte.m_argv = _argv;
 			m_mte.m_argv = _argv;
 
 
 			SDL_Init(0
 			SDL_Init(0
-				| SDL_INIT_VIDEO
 				| SDL_INIT_GAMECONTROLLER
 				| SDL_INIT_GAMECONTROLLER
 				);
 				);
 
 
@@ -547,6 +608,18 @@ namespace entry
 						}
 						}
 						break;
 						break;
 
 
+					case SDL_JOYAXISMOTION:
+						{
+							const SDL_JoyAxisEvent& jev = event.jaxis;
+							GamepadHandle handle = findGamepad(jev.which);
+							if (isValid(handle) )
+							{
+								GamepadAxis::Enum axis = translateGamepadAxis(jev.axis);
+								m_gamepad[handle.idx].update(m_eventQueue, defaultWindow, handle, axis, jev.value);
+							}
+						}
+						break;
+
 					case SDL_CONTROLLERAXISMOTION:
 					case SDL_CONTROLLERAXISMOTION:
 						{
 						{
 							const SDL_ControllerAxisEvent& aev = event.caxis;
 							const SDL_ControllerAxisEvent& aev = event.caxis;
@@ -554,10 +627,23 @@ namespace entry
 							if (isValid(handle) )
 							if (isValid(handle) )
 							{
 							{
 								GamepadAxis::Enum axis = translateGamepadAxis(aev.axis);
 								GamepadAxis::Enum axis = translateGamepadAxis(aev.axis);
-								int32_t value = aev.value;
-								if (m_gamepad[handle.idx].filter(axis, &value) )
+								m_gamepad[handle.idx].update(m_eventQueue, defaultWindow, handle, axis, aev.value);
+							}
+						}
+						break;
+
+					case SDL_JOYBUTTONDOWN:
+					case SDL_JOYBUTTONUP:
+						{
+							const SDL_JoyButtonEvent& bev = event.jbutton;
+							GamepadHandle handle = findGamepad(bev.which);
+
+							if (isValid(handle) )
+							{
+								Key::Enum key = translateGamepad(bev.button);
+								if (Key::Count != key)
 								{
 								{
-									m_eventQueue.postAxisEvent(defaultWindow, handle, axis, value);
+									m_eventQueue.postKeyEvent(defaultWindow, key, 0, event.type == SDL_JOYBUTTONDOWN);
 								}
 								}
 							}
 							}
 						}
 						}
@@ -579,14 +665,38 @@ namespace entry
 						}
 						}
 						break;
 						break;
 
 
-					case SDL_CONTROLLERDEVICEADDED:
+					case SDL_JOYDEVICEADDED:
 						{
 						{
-							const SDL_ControllerDeviceEvent& cev = event.cdevice;
+							GamepadHandle handle = { m_gamepadAlloc.alloc() };
+							if (isValid(handle) )
+							{
+								const SDL_JoyDeviceEvent& jev = event.jdevice;
+								m_gamepad[handle.idx].create(jev);
+								m_eventQueue.postGamepadEvent(defaultWindow, handle, true);
+							}
+						}
+						break;
+
+					case SDL_JOYDEVICEREMOVED:
+						{
+							const SDL_JoyDeviceEvent& jev = event.jdevice;
+							GamepadHandle handle = findGamepad(jev.which);
+							if (isValid(handle) )
+							{
+								m_gamepad[handle.idx].destroy();
+								m_gamepadAlloc.free(handle.idx);
+								m_eventQueue.postGamepadEvent(defaultWindow, handle, false);
+							}
+						}
+						break;
 
 
+					case SDL_CONTROLLERDEVICEADDED:
+						{
 							GamepadHandle handle = { m_gamepadAlloc.alloc() };
 							GamepadHandle handle = { m_gamepadAlloc.alloc() };
 							if (isValid(handle) )
 							if (isValid(handle) )
 							{
 							{
-								m_gamepad[handle.idx].create(cev.which);
+								const SDL_ControllerDeviceEvent& cev = event.cdevice;
+								m_gamepad[handle.idx].create(cev);
 								m_eventQueue.postGamepadEvent(defaultWindow, handle, true);
 								m_eventQueue.postGamepadEvent(defaultWindow, handle, true);
 							}
 							}
 						}
 						}