فهرست منبع

Mouse button support

Karl Zylinski 6 ماه پیش
والد
کامیت
df5d792b6b
4فایلهای تغییر یافته به همراه62 افزوده شده و 7 حذف شده
  1. 4 3
      examples/box2d/karl2d_box2d.odin
  2. 18 4
      karl2d.odin
  3. 10 0
      window_interface.odin
  4. 30 0
      window_win32.odin

+ 4 - 3
examples/box2d/karl2d_box2d.odin

@@ -99,9 +99,10 @@ main :: proc() {
 		k2.clear(k2.BLACK)
 
 		k2.draw_rect(ground, k2.RL_RED)
-		mouse_pos := k2.get_mouse_position()
 
-		b2.Body_SetTransform(body_id, {mouse_pos.x, -mouse_pos.y}, {})
+		pos := k2.get_mouse_position()
+
+		b2.Body_SetTransform(body_id, {pos.x, -pos.y}, {})
 
 		for time_acc >= time_step {
 			b2.World_Step(world_id, time_step, sub_steps)
@@ -116,7 +117,7 @@ main :: proc() {
 			k2.draw_rect_ex({position.x, -position.y, 40, 40}, {20, 20}, a*(180/3.14), k2.RL_YELLOW)
 		}
 
-		k2.draw_circle(mouse_pos, 40, k2.RL_MAGENTA)
+		k2.draw_circle(pos, 40, k2.RL_MAGENTA)
 		k2.present()
 
 		free_all(context.temp_allocator)

+ 18 - 4
karl2d.odin

@@ -106,6 +106,8 @@ present :: proc() {
 process_events :: proc() {
 	s.keys_went_up = {}
 	s.keys_went_down = {}
+	s.mouse_button_went_up = {}
+	s.mouse_button_went_down = {}
 	s.mouse_delta = {}
 	s.mouse_wheel_delta = 0
 
@@ -123,8 +125,16 @@ process_events :: proc() {
 			s.keys_is_held[e.key] = true
 
 		case Window_Event_Key_Went_Up:
-			s.keys_is_held[e.key] = false
 			s.keys_went_up[e.key] = true
+			s.keys_is_held[e.key] = false
+
+		case Window_Event_Mouse_Button_Went_Down:
+			s.mouse_button_went_down[e.button] = true
+			s.mouse_button_is_held[e.button] = true
+
+		case Window_Event_Mouse_Button_Went_Up:
+			s.mouse_button_went_up[e.button] = true
+			s.mouse_button_is_held[e.button] = false
 
 		case Window_Event_Mouse_Move:
 			prev_pos := s.mouse_position
@@ -214,15 +224,15 @@ key_is_held :: proc(key: Keyboard_Key) -> bool {
 }
 
 mouse_button_went_down :: proc(button: Mouse_Button) -> bool {
-	panic("not implemented")
+	return s.mouse_button_went_down[button]
 }
 
 mouse_button_went_up :: proc(button: Mouse_Button) -> bool {
-	panic("not implemented")
+	return s.mouse_button_went_up[button]
 }
 
 mouse_button_is_held :: proc(button: Mouse_Button) -> bool {
-	panic("not implemented")
+	return s.mouse_button_is_held[button]
 }
 
 get_mouse_wheel_delta :: proc() -> f32 {
@@ -909,6 +919,10 @@ State :: struct {
 	keys_went_up: #sparse [Keyboard_Key]bool,
 	keys_is_held: #sparse [Keyboard_Key]bool,
 
+	mouse_button_went_down: #sparse [Mouse_Button]bool,
+	mouse_button_went_up: #sparse [Mouse_Button]bool,
+	mouse_button_is_held: #sparse [Mouse_Button]bool,
+
 	window: Window_Handle,
 	width: int,
 	height: int,

+ 10 - 0
window_interface.odin

@@ -23,6 +23,8 @@ Window_Event :: union  {
 	Window_Event_Mouse_Move,
 	Window_Event_Mouse_Wheel,
 	Window_Event_Resize,
+	Window_Event_Mouse_Button_Went_Down,
+	Window_Event_Mouse_Button_Went_Up,
 }
 
 Window_Event_Key_Went_Down :: struct {
@@ -33,6 +35,14 @@ Window_Event_Key_Went_Up :: struct {
 	key: Keyboard_Key,
 }
 
+Window_Event_Mouse_Button_Went_Down :: struct {
+	button: Mouse_Button,
+}
+
+Window_Event_Mouse_Button_Went_Up :: struct {
+	button: Mouse_Button,
+}
+
 Window_Event_Close_Wanted :: struct {}
 
 Window_Event_Mouse_Move :: struct {

+ 30 - 0
window_win32.odin

@@ -168,6 +168,36 @@ window_proc :: proc "stdcall" (hwnd: win32.HWND, msg: win32.UINT, wparam: win32.
 			delta = delta,
 		})
 
+	case win32.WM_LBUTTONDOWN:
+		append(&s.events, Window_Event_Mouse_Button_Went_Down {
+			button = .Left,
+		})
+
+	case win32.WM_LBUTTONUP:
+		append(&s.events, Window_Event_Mouse_Button_Went_Up {
+			button = .Left,
+		})
+
+	case win32.WM_MBUTTONDOWN:
+		append(&s.events, Window_Event_Mouse_Button_Went_Down {
+			button = .Middle,
+		})
+
+	case win32.WM_MBUTTONUP:
+		append(&s.events, Window_Event_Mouse_Button_Went_Up {
+			button = .Middle,
+		})
+
+	case win32.WM_RBUTTONDOWN:
+		append(&s.events, Window_Event_Mouse_Button_Went_Down {
+			button = .Right,
+		})
+
+	case win32.WM_RBUTTONUP:
+		append(&s.events, Window_Event_Mouse_Button_Went_Up {
+			button = .Right,
+		})
+
 	case win32.WM_SIZE:
 		width := win32.LOWORD(lparam)
 		height := win32.HIWORD(lparam)