浏览代码

Added gamepad vibration

Karl Zylinski 6 月之前
父节点
当前提交
e10918cdf6
共有 4 个文件被更改,包括 22 次插入0 次删除
  1. 2 0
      examples/gamepad/gamepad.odin
  2. 4 0
      karl2d.odin
  3. 1 0
      window_interface.odin
  4. 15 0
      window_win32.odin

+ 2 - 0
examples/gamepad/gamepad.odin

@@ -44,6 +44,8 @@ main :: proc() {
 		left_trigger  := k2.get_gamepad_axis(0, .Left_Trigger)
 		right_trigger := k2.get_gamepad_axis(0, .Right_Trigger)
 
+		k2.set_gamepad_vibration(0, left_trigger, right_trigger)
+
 		k2.draw_rect_vec({80, 50}, {20, 10}, button_color(.Left_Shoulder))
 		k2.draw_rect_vec({50, 50} + {0, left_trigger * 20}, {20, 10}, button_color(.Left_Trigger, k2.WHITE, k2.GRAY))
 

+ 4 - 0
karl2d.odin

@@ -288,6 +288,10 @@ get_gamepad_axis :: proc(gamepad: Gamepad_Index, axis: Gamepad_Axis) -> f32 {
 	return win.get_gamepad_axis(gamepad, axis)
 }
 
+set_gamepad_vibration :: proc(gamepad: Gamepad_Index, left: f32, right: f32) {
+	win.set_gamepad_vibration(gamepad, left, right)
+}
+
 //---------//
 // DRAWING //
 //---------//

+ 1 - 0
window_interface.odin

@@ -15,6 +15,7 @@ Window_Interface :: struct {
 	set_size: proc(w, h: int),
 	set_flags: proc(flags: Window_Flags),
 	get_gamepad_axis: proc(gamepad: int, axis: Gamepad_Axis) -> f32,
+	set_gamepad_vibration: proc(gamepad: int, left: f32, right: f32),
 
 	set_internal_state: proc(state: rawptr),
 }

+ 15 - 0
window_win32.odin

@@ -15,6 +15,8 @@ WINDOW_INTERFACE_WIN32 :: Window_Interface {
 	set_size = win32_set_size,
 	set_flags = win32_set_flags,
 	get_gamepad_axis = win32_get_gamepad_axis,
+	set_gamepad_vibration = win32_set_gamepad_vibration,
+
 	set_internal_state = win32_set_internal_state,
 }
 
@@ -208,6 +210,19 @@ win32_get_gamepad_axis :: proc(gamepad: int, axis: Gamepad_Axis) -> f32 {
 	return 0
 }
 
+win32_set_gamepad_vibration :: proc(gamepad: int, left: f32, right: f32) {
+	if gamepad < 0 || gamepad >= MAX_GAMEPADS {
+		return
+	}
+
+	vib := win32.XINPUT_VIBRATION {
+		wLeftMotorSpeed = win32.WORD(left * 65535),
+		wRightMotorSpeed = win32.WORD(right * 65535),
+	}
+
+	win32.XInputSetState(win32.XUSER(gamepad), &vib)
+}
+
 win32_set_internal_state :: proc(state: rawptr) {
 	assert(state != nil)
 	s = (^Win32_State)(state)