pawkit_input/bindings/
mod.rs

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