Skip to main content

pawkit_input/binding/
mod.rs

1use std::fmt::Debug;
2
3use serde::{Deserialize, Serialize};
4
5use crate::binding::{
6    axis::{GamepadAxis, KeyboardAxis, MouseAxis},
7    button::{GamepadButton, KeyboardButton, MouseButton},
8};
9
10pub mod axis;
11pub mod button;
12pub mod map;
13
14pub(self) macro implement_into($ty:ty) {
15    impl Into<usize> for $ty {
16        fn into(self) -> usize {
17            return self as usize;
18        }
19    }
20}
21
22#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
23#[serde(bound = "TButton: for<'a> Deserialize<'a>, TAxis: for<'a> Deserialize<'a>")]
24#[serde(tag = "mode")]
25pub enum BoundButton<TButton, TAxis>
26where
27    TButton: Debug + Copy + PartialEq + Serialize,
28    TAxis: Debug + Copy + PartialEq + Serialize,
29{
30    Analog {
31        axis: TAxis,
32        threshold: f32,
33        scale: f32,
34    },
35    Digital {
36        button: TButton,
37    },
38}
39
40#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
41#[serde(bound = "TButton: for<'a> Deserialize<'a>, TAxis: for<'a> Deserialize<'a>")]
42#[serde(tag = "mode")]
43pub enum BoundAxis<TButton, TAxis>
44where
45    TButton: Debug + Copy + PartialEq + Serialize,
46    TAxis: Debug + Copy + PartialEq + Serialize,
47{
48    Analog {
49        axis: TAxis,
50    },
51    Digital {
52        button: TButton,
53    },
54    MultiDigital {
55        negative: TButton,
56        positive: TButton,
57    },
58}
59
60#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
61#[serde(tag = "family")]
62pub enum DigitalBinding {
63    Keyboard(BoundButton<KeyboardButton, KeyboardAxis>),
64    Mouse(BoundButton<MouseButton, MouseAxis>),
65    Gamepad(BoundButton<GamepadButton, GamepadAxis>),
66}
67
68#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
69#[serde(tag = "family")]
70pub enum AnalogBindingKind {
71    Keyboard(BoundAxis<KeyboardButton, KeyboardAxis>),
72    Mouse(BoundAxis<MouseButton, MouseAxis>),
73    Gamepad(BoundAxis<GamepadButton, GamepadAxis>),
74}
75
76#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
77pub struct AnalogBinding {
78    #[serde(flatten)]
79    pub axis: AnalogBindingKind,
80    pub deadzone: f32,
81    pub scale: f32,
82}
83
84#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
85#[serde(tag = "family")]
86pub enum VectorBindingKind {
87    Keyboard {
88        x: BoundAxis<KeyboardButton, KeyboardAxis>,
89        y: BoundAxis<KeyboardButton, KeyboardAxis>,
90    },
91    Mouse {
92        x: BoundAxis<MouseButton, MouseAxis>,
93        y: BoundAxis<MouseButton, MouseAxis>,
94    },
95    Gamepad {
96        x: BoundAxis<GamepadButton, GamepadAxis>,
97        y: BoundAxis<GamepadButton, GamepadAxis>,
98    },
99}
100
101#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
102pub struct VectorBinding {
103    #[serde(flatten)]
104    pub axes: VectorBindingKind,
105    pub deadzone: f32,
106    pub scale: (f32, f32),
107}
108
109#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
110#[serde(tag = "type", content = "bindings")]
111pub enum BindingList {
112    Digital(Vec<DigitalBinding>),
113    Analog(Vec<AnalogBinding>),
114    Vector(Vec<VectorBinding>),
115}
116
117#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
118pub enum BindingKind {
119    Digital,
120    Analog,
121    Vector,
122}